<!DOCTYPE html>
<html lang="en-US" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>鹰眼轨迹服务 | VitePress</title>
    <meta name="description" content="A VitePress site">
    <link rel="preload stylesheet" href="/notebook/assets/style.3dbfd0c2.css" as="style">
    
    <script type="module" src="/notebook/assets/app.8aaa4cbe.js"></script>
    <link rel="preload" href="/notebook/assets/inter-roman-latin.2ed14f66.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="modulepreload" href="/notebook/assets/chunks/framework.1336c4e5.js">
    <link rel="modulepreload" href="/notebook/assets/chunks/theme.20cddc0c.js">
    <link rel="modulepreload" href="/notebook/assets/项目实战_百度地图_进阶篇.md.c8b93267.lean.js">
    <script id="check-dark-light">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
  </head>
  <body>
    <div id="app"><div class="Layout" data-v-255ec12d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-ae3e3f51></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-ae3e3f51> Skip to content </a><!--]--><!----><header class="VPNav" data-v-255ec12d data-v-7e5bc4a5><div class="VPNavBar has-sidebar" data-v-7e5bc4a5 data-v-0937f67c><div class="container" data-v-0937f67c><div class="title" data-v-0937f67c><div class="VPNavBarTitle has-sidebar" data-v-0937f67c data-v-86d1bed8><a class="title" href="/notebook/" data-v-86d1bed8><!--[--><!--]--><!--[--><img class="VPImage logo" src="/notebook/Vue.png" alt data-v-8426fc1a><!--]--><!--[-->任硕的文档<!--]--><!--[--><!--]--></a></div></div><div class="content" data-v-0937f67c><div class="curtain" data-v-0937f67c></div><div class="content-body" data-v-0937f67c><!--[--><!--]--><div class="VPNavBarSearch search" style="--vp-meta-key:&#39;Meta&#39;;" data-v-0937f67c><!--[--><!----><div id="docsearch"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg class="DocSearch-Search-Icon" width="20" height="20" viewBox="0 0 20 20" aria-label="search icon"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-0937f67c data-v-7f418b0f><span id="main-nav-aria-label" class="visually-hidden" data-v-7f418b0f>Main Navigation</span><!--[--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>Java学前端</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/HTML+JS.html" data-v-2f2cfafc><!--[-->HTML+JS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/CSS.html" data-v-2f2cfafc><!--[-->CSS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue2+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue2+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue3+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue3+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/React.html" data-v-2f2cfafc><!--[-->React<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>软件测试</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->测试基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95.html" data-v-2f2cfafc><!--[-->压力测试<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>多线程</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-2f2cfafc><!--[-->基础篇<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%B9%B6%E5%8F%91%E5%AE%8C%E5%96%84.html" data-v-2f2cfafc><!--[-->进阶篇<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>开发工具</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/Chrome.html" data-v-2f2cfafc><!--[-->Chrome<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/IDEA%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->IDEA基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/IDEA%E6%8F%92%E4%BB%B6.html" data-v-2f2cfafc><!--[-->IDEA插件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/VS%20Code.html" data-v-2f2cfafc><!--[-->VS Code<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>消息中间件</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RabbitMQ.html" data-v-2f2cfafc><!--[-->RabbitMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RocketMQ.html" data-v-2f2cfafc><!--[-->RocketMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka.html" data-v-2f2cfafc><!--[-->Kafka<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Canal.html" data-v-2f2cfafc><!--[-->Canal<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-0937f67c data-v-f6a63727><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-f6a63727 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-0937f67c data-v-0394ad82 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-0937f67c data-v-40855f84 data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-a7b5672a><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="icon" data-v-a7b5672a><circle cx="12" cy="12" r="2"></circle><circle cx="19" cy="12" r="2"></circle><circle cx="5" cy="12" r="2"></circle></svg></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><!----><!--[--><!--[--><!----><div class="group" data-v-40855f84><div class="item appearance" data-v-40855f84><p class="label" data-v-40855f84>Appearance</p><div class="appearance-action" data-v-40855f84><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-40855f84 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div></div></div><div class="group" data-v-40855f84><div class="item social-links" data-v-40855f84><div class="VPSocialLinks social-links-list" data-v-40855f84 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-0937f67c data-v-e5dd9c1c><span class="container" data-v-e5dd9c1c><span class="top" data-v-e5dd9c1c></span><span class="middle" data-v-e5dd9c1c></span><span class="bottom" data-v-e5dd9c1c></span></span></button></div></div></div></div><!----></header><div class="VPLocalNav reached-top" data-v-255ec12d data-v-5cfd5582><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-5cfd5582><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="menu-icon" data-v-5cfd5582><path d="M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"></path><path d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"></path><path d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"></path><path d="M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"></path></svg><span class="menu-text" data-v-5cfd5582>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-5cfd5582 data-v-18201f51><button data-v-18201f51>Return to top</button><!----></div></div><aside class="VPSidebar" data-v-255ec12d data-v-845b8fc6><div class="curtain" data-v-845b8fc6></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-845b8fc6><span class="visually-hidden" id="sidebar-aria-label" data-v-845b8fc6> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Java</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%9B%86%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java集合</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Linux</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Shell.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Shell脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E5%AE%9E%E7%94%A8%E8%84%9A%E6%9C%AC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实用脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E8%BD%AF%E4%BB%B6%E9%83%A8%E7%BD%B2.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>软件部署</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Nginx</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%AE%9E%E6%88%98%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实战篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E9%9D%A2%E8%AF%95%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>面试篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SSM</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Maven.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Maven</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Spring.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Spring</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringMVC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringMVC</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringBatch.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringBatch</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringBoot</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%BA%94%E7%94%A8%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>应用篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E8%BF%90%E7%BB%B4&amp;%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>运维&原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringCloud</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringCloud</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/Sentinel.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Sentinel</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringSecurity</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Mybatis & MybatisPlus</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/Mybatis.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Mybatis</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/MybatisPlus.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MybatisPlus</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/JPA.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JPA</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Git & ChatGPT</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Git.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Git</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Github.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Github</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/ChatGPT.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ChatGPT</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Jenkins.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Jenkins</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Netty.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Netty</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>数据库</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MySQL</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%AE%BE%E8%AE%A1.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%90%E7%BB%B4.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL运维</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/%E5%88%86%E5%BA%93%E5%88%86%E8%A1%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分库分表</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Redis</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis原理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis实战</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/%E6%9C%AC%E5%9C%B0%E7%BC%93%E5%AD%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>本地缓存</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MongoDB</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E6%95%B4%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>ElasticSearch</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/1%E3%80%81ES%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/3%E3%80%81ES%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/influxdb.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>InfluxDB</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Neo4j.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Neo4j</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>高并发 & 秒杀 & 分布式</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E5%88%86%E5%B8%83%E5%BC%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式理论</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式锁</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E7%A7%92%E6%9D%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>秒杀</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%8F%AF%E7%94%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高可用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%B9%B6%E5%8F%91.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高并发</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>云原生</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/Docker.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Docker</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/K8S.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>K8S</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>可视化 & 监控</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E5%8F%AF%E8%A7%86%E5%8C%96%E5%A4%A7%E5%B1%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>可视化大屏</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/Zabbix.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Zabbix</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>学前端</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>HTML+CSS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/HTML%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>HTML基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/CSS%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>CSS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/%E7%BD%91%E9%A1%B5%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>网页进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>JS+TS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/TypeScript.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>TS基础</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>NodeJS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Vue</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E6%96%B0%E8%AF%AD%E6%B3%95.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3新语法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue2/Vue2%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小程序</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/uniapp.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>uniapp</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>计算机基础</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>数据结构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>操作系统</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>设计模式</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>计算机网络</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/UML.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>UML</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E7%AE%97%E6%B3%95/LeetCode.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>LeetCode</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible has-active" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>项目实战</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>云尚办公</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E4%BA%91%E5%B0%9A%E5%8A%9E%E5%85%AC/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小兔鲜</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%871.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇1</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible has-active" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>地图</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>苍穹外卖</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E8%8B%8D%E7%A9%B9%E5%A4%96%E5%8D%96/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>黑马头条</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E6%94%AF%E4%BB%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>支付</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%A1%B9%E7%9B%AE%E6%8E%A8%E8%8D%90.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目推荐</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0" data-v-845b8fc6 data-v-9b797284><!----><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/team.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>团队成员</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-255ec12d data-v-669faec9><div class="VPDoc has-sidebar has-aside" data-v-669faec9 data-v-6b87e69f><!--[--><!--]--><div class="container" data-v-6b87e69f><div class="aside" data-v-6b87e69f><div class="aside-curtain" data-v-6b87e69f></div><div class="aside-container" data-v-6b87e69f><div class="aside-content" data-v-6b87e69f><div class="VPDocAside" data-v-6b87e69f data-v-3f215769><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" data-v-3f215769 data-v-ff0f39c8><div class="content" data-v-ff0f39c8><div class="outline-marker" data-v-ff0f39c8></div><div class="outline-title" data-v-ff0f39c8>On this page</div><nav aria-labelledby="doc-outline-aria-label" data-v-ff0f39c8><span class="visually-hidden" id="doc-outline-aria-label" data-v-ff0f39c8> Table of Contents for current page </span><ul class="root" data-v-ff0f39c8 data-v-d0ee3533><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-3f215769></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-6b87e69f><div class="content-container" data-v-6b87e69f><!--[--><!--]--><!----><main class="main" data-v-6b87e69f><div style="position:relative;" class="vp-doc _notebook_%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98_%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE_%E8%BF%9B%E9%98%B6%E7%AF%87" data-v-6b87e69f><div><h1 id="鹰眼轨迹服务" tabindex="-1">鹰眼轨迹服务 <a class="header-anchor" href="#鹰眼轨迹服务" aria-label="Permalink to &quot;鹰眼轨迹服务&quot;">​</a></h1><h2 id="鹰眼轨迹介绍" tabindex="-1">鹰眼轨迹介绍 <a class="header-anchor" href="#鹰眼轨迹介绍" aria-label="Permalink to &quot;鹰眼轨迹介绍&quot;">​</a></h2><ul><li>鹰眼是一套轨迹管理服务，提供各端SDK和API供开发者便捷接入，追踪所管理的车辆/人员等运动物体。</li><li>基于鹰眼提供的接口和云端服务，开发者可以迅速构建一套完全属于您自己的完整、精准且高性能的轨迹管理系统，可应用于车队管理、人员管理等领域。文档：<a href="https://lbsyun.baidu.com/index.php?title=yingyan" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan</a></li></ul><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207151648980.png" alt="image-20220715164835886" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303140947690.png" alt="image-20230314094728598" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303140947185.png" alt="image-20230314094744030" style="zoom:80%;"><h2 id="鹰眼轨迹基本概念" tabindex="-1">鹰眼轨迹基本概念 <a class="header-anchor" href="#鹰眼轨迹基本概念" aria-label="Permalink to &quot;鹰眼轨迹基本概念&quot;">​</a></h2><h3 id="service" tabindex="-1">service <a class="header-anchor" href="#service" aria-label="Permalink to &quot;service&quot;">​</a></h3><blockquote><p>一个service（即鹰眼轨迹服务）对应一个轨迹管理系统，一个service里可管理多个终端设备（即entity），service的唯一标识符是service_id。</p></blockquote><h3 id="entity" tabindex="-1">entity <a class="header-anchor" href="#entity" aria-label="Permalink to &quot;entity&quot;">​</a></h3><blockquote><p>一个entity代表现实中一个被追踪轨迹的终端设备，它可以是一个人、一辆车或者任何运动物体。同一个service中，entity以entity_name作为唯一标识。</p></blockquote><h3 id="track" tabindex="-1">track <a class="header-anchor" href="#track" aria-label="Permalink to &quot;track&quot;">​</a></h3><blockquote><p>entity移动所产生的连续轨迹被称为track，track由一系列轨迹点（point）组成。</p></blockquote><h3 id="fence" tabindex="-1">fence <a class="header-anchor" href="#fence" aria-label="Permalink to &quot;fence&quot;">​</a></h3><blockquote><p>fence即地理围栏，是指一定范围（如：圆形、多边形、线型、行政区）的虚拟地理区域。当entity进入/离开该区域时，鹰眼将自动推送报警至开发者。开发者接收到报警后，可进行业务处理。</p></blockquote><p>更多说明：<a href="https://lbsyun.baidu.com/index.php?title=yingyan/guide/concept" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan/guide/concept</a></p><h2 id="权限与配额" tabindex="-1">权限与配额 <a class="header-anchor" href="#权限与配额" aria-label="Permalink to &quot;权限与配额&quot;">​</a></h2><p>鹰眼开发者的使用权限包括：</p><h3 id="数据存储" tabindex="-1">数据存储 <a class="header-anchor" href="#数据存储" aria-label="Permalink to &quot;数据存储&quot;">​</a></h3><ul><li>开发者可向自己的鹰眼服务中上传轨迹数据。</li><li>鹰眼将为开发者存储最近1年的轨迹数据。</li><li>若需保留1年之外的轨迹数据，需要自己查询或导出数据进行自行存储。</li></ul><h3 id="数据访问" tabindex="-1">数据访问 <a class="header-anchor" href="#数据访问" aria-label="Permalink to &quot;数据访问&quot;">​</a></h3><ul><li>开发者创建的鹰眼服务可被该帐号下的ak访问，除非开发者授权，否则不可被其他用户访问。</li><li>鹰眼轨迹管理台提供授权功能，支持开发者将自有 service 授权给其他开发者访问。</li></ul><p>开放平台的每一类 API 都有调用配额限制，配额为帐号下所有ak和service共用。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207151651391.png" alt="image-20220715165113342" style="zoom:67%;"><p>详细的配额说明参见：<a href="https://lbsyun.baidu.com/index.php?title=yingyan/guide/quota" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan/guide/quota</a></p><h2 id="创建鹰眼服务" tabindex="-1">创建鹰眼服务 <a class="header-anchor" href="#创建鹰眼服务" aria-label="Permalink to &quot;创建鹰眼服务&quot;">​</a></h2><h3 id="创建服务" tabindex="-1">创建服务 <a class="header-anchor" href="#创建服务" aria-label="Permalink to &quot;创建服务&quot;">​</a></h3><ul><li>使用鹰眼轨迹服务首先需要创建service，用于存储、访问和管理自己的一批终端和轨迹。</li><li>服务管理系统：<a href="https://lbsyun.baidu.com/trace/admin/service" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/trace/admin/service</a></li><li>每个service最多可管理100万终端（人、车等），一个开发者最多可创建10个 service。</li><li>若开发者拥有超过100万的终端，可以创建多个 service 分别管理。</li></ul><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207151653513.png" alt="image-20220715165321461" style="zoom:67%;"><h3 id="获取服务id" tabindex="-1">获取服务id <a class="header-anchor" href="#获取服务id" aria-label="Permalink to &quot;获取服务id&quot;">​</a></h3><ul><li>创建服务成功后，在&quot;我创建的服务&quot;列表中即可看到新增的 service。</li><li>列表左侧的“系统 ID（service_id）”，如：128658，即为访问该service的唯一标识，在后续的接口调用中均要使用。</li></ul><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207151654590.png" alt="image-20220715165415534" style="zoom:67%;"><h3 id="进入服务" tabindex="-1">进入服务 <a class="header-anchor" href="#进入服务" aria-label="Permalink to &quot;进入服务&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171729036.png" alt="image-20220717172928984" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171729082.png" alt="image-20220717172946928" style="zoom:67%;"><h2 id="终端管理⭐" tabindex="-1">终端管理⭐ <a class="header-anchor" href="#终端管理⭐" aria-label="Permalink to &quot;终端管理⭐&quot;">​</a></h2><ul><li>终端管理类接口主要实现：entity的创建、更新、删除、查询。</li><li>例如：添加骑行路线、删除骑行路线、更新骑行路线的属性信息（如：骑行路线的名称）等。</li><li>文档： <a href="https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/entity" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/entity</a></li><li>entity 管理类接口实现 entity 的创建、更新、删除、查询。包括四个接口：</li></ul><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207151655214.png" alt="image-20220715165507157" style="zoom:67%;"><h3 id="添加终端" tabindex="-1">添加终端 <a class="header-anchor" href="#添加终端" aria-label="Permalink to &quot;添加终端&quot;">​</a></h3><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">http</span><span style="color:#89DDFF;">://</span><span style="color:#A6ACCD;">yingyan</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">baidu</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">com</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">api</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">v3</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">entity</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">add </span><span style="color:#89DDFF;">//</span><span style="color:#A6ACCD;">POST请求</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171757941.png" alt="image-20220717175728857" style="zoom:80%;"><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> ak </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">sZWkMbcUn2zbmDsuM7Au1KUT1LSSa7s2</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testEntityAdd</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> url </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://yingyan.baidu.com/api/v3/entity/add</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> body </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> HttpRequest</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">post</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">ak</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> ak</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">service_id</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">233603</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_desc</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo的1001轨迹</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">execute</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">body</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171829131.png" alt="image-20220717182905091" style="zoom:67%;"><p>访问：<a href="https://lbsyun.baidu.com/trace/admin/manager?service_id=233603" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/trace/admin/manager?service_id=233603</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303141000486.png" alt="image-20230314100049408" style="zoom:80%;"><h3 id="添加entity自定义字段" tabindex="-1">添加Entity自定义字段 <a class="header-anchor" href="#添加entity自定义字段" aria-label="Permalink to &quot;添加Entity自定义字段&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171758468.png" alt="image-20220717175815374" style="zoom:67%;"><h3 id="更新entity自定义字段" tabindex="-1">更新Entity自定义字段 <a class="header-anchor" href="#更新entity自定义字段" aria-label="Permalink to &quot;更新Entity自定义字段&quot;">​</a></h3><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testEntityAdd</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> url </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://yingyan.baidu.com/api/v3/entity/update</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> body </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> HttpRequest</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">post</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">ak</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> ak</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">service_id</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">233603</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// service的唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// entity名称，作为唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_desc</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo的1001轨迹</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// entity的可读性描述</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">route_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">从百草园到三味书屋</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 自定义字段</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">execute</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">body</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171759645.png" alt="image-20220717175914568" style="zoom:67%;"><h3 id="删除entity" tabindex="-1">删除Entity <a class="header-anchor" href="#删除entity" aria-label="Permalink to &quot;删除Entity&quot;">​</a></h3><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testEntityDelete</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> url </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://yingyan.baidu.com/api/v3/entity/delete</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> body </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> HttpRequest</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">post</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">ak</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> ak</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">service_id</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">233603</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// service的唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">user1</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// entity名称，作为唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">execute</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">body</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171801677.png" alt="image-20220717180150602" style="zoom:67%;"><h3 id="查询entity" tabindex="-1">查询Entity <a class="header-anchor" href="#查询entity" aria-label="Permalink to &quot;查询Entity&quot;">​</a></h3><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testEntityList</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> url </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://yingyan.baidu.com/api/v3/entity/list</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> body </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> HttpRequest</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">get</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">ak</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> ak</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">service_id</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">233603</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// service的唯一标识</span></span>
<span class="line"><span style="color:#89DDFF;">            </span><span style="color:#676E95;font-style:italic;">//.form(&quot;filter&quot;, &quot;renshuo&quot;) // 可选，根据entity_name查询</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">execute</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">body</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303141028427.png" alt="image-20230314102828343" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171802783.png" alt="image-20220717180232700" style="zoom:67%;"><h2 id="轨迹上传" tabindex="-1">轨迹上传 <a class="header-anchor" href="#轨迹上传" aria-label="Permalink to &quot;轨迹上传&quot;">​</a></h2><p>为 entity 上传轨迹点，支持为一个 entity上传一个或多个轨迹点，也支持为多个 entity 上传多个轨迹点。</p><p>目前中国主要有以下三种坐标系：</p><ul><li>WGS84：为一种大地坐标系，也是目前广泛使用的GPS全球卫星定位系统使用的坐标系</li><li>GCJ02：是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系</li><li>BD09：为百度坐标系，在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标，bd09mc表示百度墨卡托米制坐标</li><li>非中国地区地图，统一使用WGS84坐标</li></ul><p>文档：<a href="https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/trackupload" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/trackupload</a></p><h3 id="单点轨迹上传" tabindex="-1">单点轨迹上传 <a class="header-anchor" href="#单点轨迹上传" aria-label="Permalink to &quot;单点轨迹上传&quot;">​</a></h3><p>去百度地图坐标拾取系统拿坐标测试：<a href="https://api.map.baidu.com/lbsapi/getpoint/index.html" target="_blank" rel="noreferrer">https://api.map.baidu.com/lbsapi/getpoint/index.html</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171811606.png" alt="image-20220717181110480" style="zoom:67%;"><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testAddPoint</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> url </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">https://yingyan.baidu.com/api/v3/track/addpoint</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> body </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> HttpRequest</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">post</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">ak</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> ak</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">service_id</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">233603</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// service的唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// entity名称，作为唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">latitude</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">31.040699</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 纬度</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">longitude</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">121.618075</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 精度</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">loc_time</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;">System</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">currentTimeMillis</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1000</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 定位时设备的时间</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">coord_type_input</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">bd09ll</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 坐标类型，默认值bd09ll</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">speed</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">10.15</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 速度</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">execute</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">body</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303141035704.png" alt="image-20230314103559599" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303141036546.png" alt="image-20230314103627400" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171808870.png" alt="image-20220717180827772" style="zoom:80%;"><h3 id="多点轨迹上传" tabindex="-1">多点轨迹上传 <a class="header-anchor" href="#多点轨迹上传" aria-label="Permalink to &quot;多点轨迹上传&quot;">​</a></h3><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testAddPoints</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> url </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">https://yingyan.baidu.com/api/v3/track/addpoints</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">List</span><span style="color:#89DDFF;">&lt;</span><span style="color:#C792EA;">Object</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> pointList </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">ArrayList</span><span style="color:#89DDFF;">&lt;&gt;();</span></span>
<span class="line"><span style="color:#A6ACCD;">    pointList</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">add</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">MapUtil</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">builder</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">put</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">put</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">latitude</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">31.040699</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">put</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">longitude</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">121.618075</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">put</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">loc_time</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;">System</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">currentTimeMillis</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1000</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">put</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">coord_type_input</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">bd09ll</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">put</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">speed</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">11.23</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">put</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">direction</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">15</span><span style="color:#89DDFF;">).</span><span style="color:#82AAFF;">build</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 方向</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">    </span><span style="color:#676E95;font-style:italic;">// 多个点只需要和上面一样pointList.add即可</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> body </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> HttpRequest</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">post</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">ak</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> ak</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">service_id</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">233603</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// service的唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">point_list</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> JSONUtil</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">toJsonStr</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">pointList</span><span style="color:#89DDFF;">))</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// entity名称，作为唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">execute</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">body</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171816002.png" alt="image-20220717181654925"></p><h3 id="轨迹上传⭐" tabindex="-1">轨迹上传⭐ <a class="header-anchor" href="#轨迹上传⭐" aria-label="Permalink to &quot;轨迹上传⭐&quot;">​</a></h3><p>我们可以将多个轨迹点上传到百度地图，查看他在地图上的轨迹。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171814228.png" alt="image-20220717181431160" style="zoom:67%;"><ul><li>可以根据entity的名称查询路线中的轨迹点信息。</li><li>百度地图查询路线轨迹信息是支持轨迹纠偏的。</li><li>各种定位方式或多或少都存在着一定的误差，GPS信号不好的时候（例如，楼宇密集处、高架桥下、隧道等），可能就会使用WI-FI或基站定位，特别是当周边WI-FI热点比较少的时候会使用基站定位，定位误差会有所加大，产生轨迹漂移的现象。</li><li>为了纠正轨迹漂移，提升轨迹和里程的准确性，鹰眼在轨迹查询服务中提供了高性能的轨迹纠偏功能。</li><li>支持查询实时位置、一段时间内的轨迹里程、一段时间内的轨迹点。</li></ul><p>文档：<a href="https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/trackprocess" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/trackprocess</a></p><p>创建新实体</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testEntityAdd</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> url </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://yingyan.baidu.com/api/v3/entity/add</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> body </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> HttpRequest</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">post</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">ak</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> ak</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">service_id</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">233603</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// service的唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo3</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// entity名称，作为唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_desc</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo的1002轨迹</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// entity的可读性描述</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">route_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">从百草园到三味书屋</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 自定义字段</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">execute</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">body</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testAddPoints</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> url </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">https://yingyan.baidu.com/api/v3/track/addpoint</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> point </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">117.224976,39.10971|117.225479,39.10747</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 经纬度用坐标拾取器拿就行，用|分隔开</span></span>
<span class="line"><span style="color:#A6ACCD;">    StrUtil</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">split</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">point</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">|</span><span style="color:#89DDFF;">&#39;</span><span style="color:#89DDFF;">).</span><span style="color:#82AAFF;">forEach</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">pointStr </span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#C792EA;">String</span><span style="color:#89DDFF;">[]</span><span style="color:#A6ACCD;"> splitStr </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> StrUtil</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">splitToArray</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">pointStr</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">,</span><span style="color:#89DDFF;">&#39;</span><span style="color:#89DDFF;">);</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 再将经纬度按逗号分隔</span></span>
<span class="line"><span style="color:#89DDFF;">        </span><span style="color:#676E95;font-style:italic;">// 创建实体</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> body </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> HttpRequest</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">post</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">ak</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> ak</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">service_id</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">233603</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// service的唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo3</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// entity名称，作为唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">latitude</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> Convert</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">toDouble</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">splitStr</span><span style="color:#89DDFF;">[</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">]))</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 纬度</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">longitude</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;">Convert</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">toDouble</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">splitStr</span><span style="color:#89DDFF;">[</span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">]))</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 经度</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">loc_time</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;">System</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">currentTimeMillis</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1000</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 定位时设备的时间</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">coord_type_input</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">bd09ll</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 坐标类型，默认值bd09ll</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">speed</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">10.15</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 速度</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">direction</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">15</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">execute</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">        System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">body</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">});</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><p><a href="https://lbsyun.baidu.com/trace/admin/manager?service_id=233603" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/trace/admin/manager?service_id=233603</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303141114728.png" alt="image-20230314111416551" style="zoom:80%;"><h3 id="根据时间查询轨迹" tabindex="-1">根据时间查询轨迹 <a class="header-anchor" href="#根据时间查询轨迹" aria-label="Permalink to &quot;根据时间查询轨迹&quot;">​</a></h3><p>我们重点来看根据时间查询轨迹的接口服务。</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testEntityTetTrack</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> url </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">https://yingyan.baidu.com/api/v3/track/gettrack</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">Long</span><span style="color:#A6ACCD;"> startTime </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> DateUtil</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">parse</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">2023-3-14 00:00:00</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">).</span><span style="color:#82AAFF;">getTime</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1000</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">Long</span><span style="color:#A6ACCD;"> endTime </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> DateUtil</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">parse</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">2023-3-14 20:00:00</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">).</span><span style="color:#82AAFF;">getTime</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1000</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> body </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> HttpRequest</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">get</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">url</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">ak</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> ak</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">service_id</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">233603</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// service的唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">entity_name</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">renshuo3</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// entity名称，作为唯一标识</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">start_time</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;">startTime</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 定位时设备的时间</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">end_time</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;">endTime</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 坐标类型，默认值bd09ll</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">form</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">is_processed</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// 是否返回纠偏后的轨迹</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">execute</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">body</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303141455429.png" alt="image-20230314145547342" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.6.30/202207171815108.png" alt="image-20220717181552019" style="zoom:80%;"><h1 id="运动健康与社交" tabindex="-1">运动健康与社交 <a class="header-anchor" href="#运动健康与社交" aria-label="Permalink to &quot;运动健康与社交&quot;">​</a></h1><h2 id="轻骑项目概述" tabindex="-1">轻骑项目概述 <a class="header-anchor" href="#轻骑项目概述" aria-label="Permalink to &quot;轻骑项目概述&quot;">​</a></h2><blockquote><p>轻骑项目是一个基于微信小程序的骑行运动类的应用，类似Keep应用。主要是记录用户的骑行运动轨迹、保存路线、分享路线、附近的人、附近的路线等功能。对于运动轨迹的实现主要基于百度地图的鹰眼轨迹服务实现。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131056876.png" alt="image-20230313105630747" style="zoom:80%;"><h2 id="申请微信小程序" tabindex="-1">申请微信小程序 <a class="header-anchor" href="#申请微信小程序" aria-label="Permalink to &quot;申请微信小程序&quot;">​</a></h2><h3 id="注册小程序开发者账号" tabindex="-1">注册小程序开发者账号 <a class="header-anchor" href="#注册小程序开发者账号" aria-label="Permalink to &quot;注册小程序开发者账号&quot;">​</a></h3><p>开发微信小程序首先需要注册开发者账号。</p><p>注册地址：<a href="https://mp.weixin.qq.com/wxopen/waregister?action=step1&amp;token=&amp;lang=zh_CN" target="_blank" rel="noreferrer">https://mp.weixin.qq.com/wxopen/waregister?action=step1&amp;token=&amp;lang=zh_CN</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131059240.png" alt="image-20230313105922144" style="zoom:80%;"><h3 id="获取appid" tabindex="-1">获取AppID <a class="header-anchor" href="#获取appid" aria-label="Permalink to &quot;获取AppID&quot;">​</a></h3><p>小程序的AppID在后续的开发中会用到，非常重要的信息。开发管理中 ---&gt; 开发设置中可以获取到AppID。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131100029.png" alt="image-20230313110010939" style="zoom:80%;"><h3 id="小程序开发者工具" tabindex="-1">小程序开发者工具 <a class="header-anchor" href="#小程序开发者工具" aria-label="Permalink to &quot;小程序开发者工具&quot;">​</a></h3><p>小程序的开发与调试，需要使用微信提供的开发者工具。</p><p>下载地址：<a href="https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html" target="_blank" rel="noreferrer">https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html</a></p><p>安装包已经在资料中提供，一路下一步安装即可。</p><h2 id="搭建项目环境" tabindex="-1">搭建项目环境 <a class="header-anchor" href="#搭建项目环境" aria-label="Permalink to &quot;搭建项目环境&quot;">​</a></h2><h3 id="导入微信小程序项目" tabindex="-1">导入微信小程序项目 <a class="header-anchor" href="#导入微信小程序项目" aria-label="Permalink to &quot;导入微信小程序项目&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131102847.png" alt="image-20230313110201722" style="zoom:80%;"><h3 id="前后端接口定义" tabindex="-1">前后端接口定义 <a class="header-anchor" href="#前后端接口定义" aria-label="Permalink to &quot;前后端接口定义&quot;">​</a></h3><p>前后端的接口定义在yapi系统中，地址： <a href="https://mock-java.itheima.net/" target="_blank" rel="noreferrer">https://mock-java.itheima.net/</a></p><p>登录的用户名： <a href="mailto:qingqi@itcast.cn" target="_blank" rel="noreferrer">qingqi@itcast.cn</a> 密码：123456</p><p>共定义了15个接口，在后端服务中需要实现这些接口。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131104991.png" alt="image-20230313110451892" style="zoom:80%;"><h3 id="部署mongoddb、redis服务" tabindex="-1">部署MongodDB、Redis服务 <a class="header-anchor" href="#部署mongoddb、redis服务" aria-label="Permalink to &quot;部署MongodDB、Redis服务&quot;">​</a></h3><p>在后台实现服务中，需要使到MongoDB以及Redis服务。</p><p>资料中的《docker安装MongoDB、Redis.md》文档进行部署安装。</p><h3 id="导入后端服务工程" tabindex="-1">导入后端服务工程 <a class="header-anchor" href="#导入后端服务工程" aria-label="Permalink to &quot;导入后端服务工程&quot;">​</a></h3><p>在代码目录中找到 my-qingqi ，将其拷贝到自己的代码目录中，导入到idea中。</p><p>此工程是通过Maven构建，导入后会自动下载所需要的依赖包。</p><p>该工程已经包含了一些基础代码，如：微信小程序授权登录、登录token校验、基础的vo对象等。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131105235.png" alt="image-20230313110559155" style="zoom:80%;"><h3 id="配置说明" tabindex="-1">配置说明 <a class="header-anchor" href="#配置说明" aria-label="Permalink to &quot;配置说明&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131106257.png" alt="image-20230313110624188" style="zoom:80%;"><blockquote><p>application.properties 文件中配置当前激活的配置项</p><p>application-local.properties 文件中配置了服务端口、MongoDB连接、Redis链接信息。</p><p>rsa.properties 文件配置了RSA非对称加密的公钥与私钥</p><p>weixin.properties 文件配置了微信小程序的appId、secret等信息。</p><p>在微信小程序的后台中，开发管理 -&gt; 开发设置中可以找到自己的信息。</p></blockquote><h3 id="小程序授权登录" tabindex="-1">小程序授权登录 <a class="header-anchor" href="#小程序授权登录" aria-label="Permalink to &quot;小程序授权登录&quot;">​</a></h3><p>小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识，快速建立小程序内的用户体系。</p><p>文档地址： <a href="https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html" target="_blank" rel="noreferrer">https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131118580.png" alt="image-20230313111826494" style="zoom:80%;"><h3 id="更新用户信息" tabindex="-1">更新用户信息 <a class="header-anchor" href="#更新用户信息" aria-label="Permalink to &quot;更新用户信息&quot;">​</a></h3><p>在小程序登录成功后，需要获取到用户的基本信息，如：昵称、头像、城市等，将其更新到MongoDB中。</p><p>在导入的工程中，已经完成了这个接口服务的开发。</p><p>接口定义地址：<a href="https://mock-java.itheima.net/project/3051/interface/api/37271" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37271</a></p><p>请求接受是在WeiXinController中的updateUser()方法中完成的。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131119159.png" alt="image-20230313111911074" style="zoom:80%;"><h3 id="查询用户信息" tabindex="-1">查询用户信息 <a class="header-anchor" href="#查询用户信息" aria-label="Permalink to &quot;查询用户信息&quot;">​</a></h3><p>导入的工程中，完成了查询用户基本信息的接口服务。</p><p>接口定义地址：<a href="https://mock-java.itheima.net/project/3051/interface/api/37259" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37259</a></p><p>其实现是在UserController中的queryMyInfo()方法中完成的。</p><p>MyInfoVo中的count、totalDistance、averageSpeed、totalTime在后续的实现中完成填充。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131119067.png" alt="image-20230313111936986" style="zoom:80%;"><h3 id="token校验拦截器" tabindex="-1">Token校验拦截器 <a class="header-anchor" href="#token校验拦截器" aria-label="Permalink to &quot;Token校验拦截器&quot;">​</a></h3><p>在登录完成后，后续所有的请求头中会携带token。通过TokefjnInterceptor拦截器中对token做校验，如果token是伪造或过期，就会拦截请求，并且响应401，token有效则放行。</p><p>校验token有效后，会将用户id存放到UserThreadLocal中，在需要时直接取出即可。</p><p>标记了@NoAuthorization的 Controller中的方法不会进行拦截处理。</p><h3 id="通用响应原则" tabindex="-1">通用响应原则 <a class="header-anchor" href="#通用响应原则" aria-label="Permalink to &quot;通用响应原则&quot;">​</a></h3><p>为了简化Controller中的开发，我们将响应进行了统一处理。</p><p>如果成功，就响应200状态码。</p><p>如果失败，就响应500状态码。</p><p>响应的数据直接返回，无需进行包装处理。</p><p>具体逻辑在 com.qingqi.interceptor.CommonResponseBodyAdvice 类中实现。</p><h2 id="骑行路线服务" tabindex="-1">骑行路线服务 <a class="header-anchor" href="#骑行路线服务" aria-label="Permalink to &quot;骑行路线服务&quot;">​</a></h2><h3 id="开始骑行" tabindex="-1">开始骑行 <a class="header-anchor" href="#开始骑行" aria-label="Permalink to &quot;开始骑行&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131405243.png" alt="image-20230313140520164" style="zoom:80%;"><p>用户点击 【开始骑行】按钮时，调用后端的创建路线的服务。创建路线包括2个方面的处理：</p><p>在MongoDB表中存储路线数据，所对应的实体为：Route，对应的表为：tb_route</p><p>调用百度地图鹰眼轨迹服务，创建该路线所对应的实体。</p><h3 id="停止骑行" tabindex="-1">停止骑行 <a class="header-anchor" href="#停止骑行" aria-label="Permalink to &quot;停止骑行&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131406753.png" alt="image-20230313140633676" style="zoom:67%;"><blockquote><p>用户在骑行的过程中，按下暂停按钮，如果是长按是结束运动，如果是短按是暂停。</p><p>如果，用户选择结束运动，并且运动时间小于3分钟，此次运动是无效的，需要将对应的路线数据删除。</p><p>如果运动时间大于3分钟，是有效运动，需要正常结束，具体流程在后面讲解。</p><p>删除路线同样也是2个处理，第一个是删除MongoDB中数据，第二个删除百度地图鹰眼服务中的实体。</p></blockquote><h3 id="实现创建路线服务" tabindex="-1">实现创建路线服务 <a class="header-anchor" href="#实现创建路线服务" aria-label="Permalink to &quot;实现创建路线服务&quot;">​</a></h3><p>接口定义文档：<a href="https://mock-java.itheima.net/project/3051/interface/api/37283" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37283</a></p><p>该接口无需请求参数，创建路线成功后返回routeId即可。</p><p>Route路线实体如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131408978.png" alt="image-20230313140826883" style="zoom:67%;"><p>第一步，创建RouteController、RouteService 、BaiduService。</p><p>第二步，在RouteController创建createRoute()</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131410432.png" alt="image-20230313141011339" style="zoom:80%;"><p>第三步，在RouteService 中编写具体的业务逻辑。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131410738.png" alt="image-20230313141032645" style="zoom:80%;"><p>第四步，在BaiduService 中实现创建实体逻辑。</p><p>创建baidu.properties配置文件，配置ak、serverId、url等内容。</p><p>编写通用的BaiduApiService服务，并且开启Spring的失败重试机制，在启动类中添加@Retryable注解。</p><p>实现具体的创建实体逻辑。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131411284.png" alt="image-20230313141100196" style="zoom:80%;"><h3 id="实现创建路线服务–测试" tabindex="-1">实现创建路线服务–测试 <a class="header-anchor" href="#实现创建路线服务–测试" aria-label="Permalink to &quot;实现创建路线服务–测试&quot;">​</a></h3><p>在微信小程序中进行测试，会发现数据库以及百度地图服务中均以创建了路线。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131411329.png" alt="image-20230313141157229" style="zoom:80%;"><h3 id="实现删除路线服务" tabindex="-1">实现删除路线服务 <a class="header-anchor" href="#实现删除路线服务" aria-label="Permalink to &quot;实现删除路线服务&quot;">​</a></h3><p>删除路线接口服务地址：<a href="https://mock-java.itheima.net/project/3051/interface/api/37289" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37289</a></p><p>需要注意的是，该接口是DELETE请求，请求参数为路线id，没有返回数据。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131414511.png" alt="image-20230313141400410" style="zoom:80%;"><h2 id="上报地理位置" tabindex="-1">上报地理位置 <a class="header-anchor" href="#上报地理位置" aria-label="Permalink to &quot;上报地理位置&quot;">​</a></h2><h3 id="说明" tabindex="-1">说明 <a class="header-anchor" href="#说明" aria-label="Permalink to &quot;说明&quot;">​</a></h3><p>在骑行运动过程中，每隔15秒上报一次用户的地理位置，运动多个点组成运动轨迹。</p><p>接口文档地址：<a href="https://mock-java.itheima.net/project/3051/interface/api/37277" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37277</a></p><p>请求参数如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131414196.png" alt="image-20230313141432107" style="zoom:80%;"><p>需要说明的是，运动过程中只是把位置上报给百度地图，MongoDB中不做存储，在运动结束后，将该路线中所有的运动轨迹点查询回来，存储到MongoDB中。在上报运动地理位置时，同时需要更新用户自身的地理位置数据到MongoDB。</p><h3 id="实现功能" tabindex="-1">实现功能 <a class="header-anchor" href="#实现功能" aria-label="Permalink to &quot;实现功能&quot;">​</a></h3><p>编写RunController实现具体业务逻辑。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131415673.png" alt="image-20230313141524572" style="zoom:67%;"><p>上报地理位置数据到百度地图服务。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131415394.png" alt="image-20230313141550293" style="zoom:80%;"><h3 id="单元测试" tabindex="-1">单元测试 <a class="header-anchor" href="#单元测试" aria-label="Permalink to &quot;单元测试&quot;">​</a></h3><p>通过单元测试的方式，像路线中添加多个位置点。测试效果如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131416406.png" alt="image-20230313141624300" style="zoom:80%;"><h3 id="更新地理位置" tabindex="-1">更新地理位置 <a class="header-anchor" href="#更新地理位置" aria-label="Permalink to &quot;更新地理位置&quot;">​</a></h3><p>更新用户的地理位置，需要异步更新，这里采用的是Spring的异步方式实现。启动类中需要添加 @EnableAsync 注解</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131416708.png" alt="image-20230313141658612" style="zoom:80%;"><h2 id="结束骑行运动" tabindex="-1">结束骑行运动 <a class="header-anchor" href="#结束骑行运动" aria-label="Permalink to &quot;结束骑行运动&quot;">​</a></h2><h3 id="实现功能-1" tabindex="-1">实现功能 <a class="header-anchor" href="#实现功能-1" aria-label="Permalink to &quot;实现功能&quot;">​</a></h3><blockquote><p>结束骑行，也就是运动时间大于3分钟的有效运动，正常的结束操作。</p><p>结束时，需要填写路线名称，在后端需要通过百度地图鹰眼服务查询该路线所有的轨迹点，存储到MongoDB中。</p><p>接口文档地址：<a href="https://mock-java.itheima.net/project/3051/interface/api/37301" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37301</a></p><p>请求参数有：路线id，路线标题。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131037980.png" alt="image-20230313103731890" style="zoom:80%;"><h2 id="查询与投稿路线" tabindex="-1">查询与投稿路线 <a class="header-anchor" href="#查询与投稿路线" aria-label="Permalink to &quot;查询与投稿路线&quot;">​</a></h2><h3 id="查询路线" tabindex="-1">查询路线 <a class="header-anchor" href="#查询路线" aria-label="Permalink to &quot;查询路线&quot;">​</a></h3><p>在保存路线成功后，需要根据路线id查询路线数据。</p><p>接口定义文档地址： <a href="https://mock-java.itheima.net/project/3051/interface/api/37307" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37307</a></p><p>该接口的请求路径参数为：路线id，请求参数：当前用户的经纬度，用于计算路线与用户之间的距离。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131040192.png" alt="image-20230313104002106" style="zoom:80%;"><h3 id="投稿路线" tabindex="-1">投稿路线 <a class="header-anchor" href="#投稿路线" aria-label="Permalink to &quot;投稿路线&quot;">​</a></h3><p>投稿路线实际上就是分享路线，其他人可以看到这个路线后，沿着该路线运动。</p><p>接口定义文档地址： <a href="https://mock-java.itheima.net/project/3051/interface/api/37295" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37295</a></p><p>该接口的请求路径参数为：路线id</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131040969.png" alt="image-20230313104033883" style="zoom:80%;"><p>RouteService中的实现：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131040647.png" alt="image-20230313104056564" style="zoom:80%;"><h2 id="附近的路线与人" tabindex="-1">附近的路线与人 <a class="header-anchor" href="#附近的路线与人" aria-label="Permalink to &quot;附近的路线与人&quot;">​</a></h2><h3 id="附近的路线" tabindex="-1">附近的路线 <a class="header-anchor" href="#附近的路线" aria-label="Permalink to &quot;附近的路线&quot;">​</a></h3><p>用户在首页点击【路线】 -&gt; 【附近】 -&gt; 【附近的路线】可以查看自己附近的路线。</p><p>为了方便测试，我们构造几条测试数据，参数脚本以及数据已经放到资料目录中，直接导入到MongoDB即可。</p><p>注意：userid需要改成自己的用户id。</p><p>接口文档地址：<a href="https://mock-java.itheima.net/project/3051/interface/api/37313" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37313</a></p><p>实现原理：根据中心点坐标+距离（半径），在MongoDB中按照圆形范围查询。</p><p>实现时，使用NearQuery进行查询，默认按照由近到远的数据返回，并且会返回之间距离数据。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131042774.png" alt="image-20230313104219683" style="zoom:80%;"><p>在微信开发者工具设置位置数据为：31.034952，121.612063 （方便测试数据）</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131042132.png" alt="image-20230313104242043" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131043449.png" alt="image-20230313104319333" style="zoom:80%;"><h3 id="附近的人" tabindex="-1">附近的人 <a class="header-anchor" href="#附近的人" aria-label="Permalink to &quot;附近的人&quot;">​</a></h3><p>用户在首页点击【路线】 à 【附近】 à 【附近的人】可以查看自己附近的人。</p><p>为了方便测试，我们构造几条测试数据，数据脚本已经放到资料目录中，直接导入到MongoDB即可。</p><p>接口文档地址：<a href="https://mock-java.itheima.net/project/3051/interface/api/37331" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37331</a></p><p>实现原理：根据中心点坐标+距离（半径），在MongoDB中按照圆形范围查询。</p><p>实现时，使用NearQuery进行查询，默认按照由近到远的数据返回，并且会返回之间距离数据。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131044207.png" alt="image-20230313104404123" style="zoom:80%;"><h2 id="沿着路线骑行" tabindex="-1">沿着路线骑行 <a class="header-anchor" href="#沿着路线骑行" aria-label="Permalink to &quot;沿着路线骑行&quot;">​</a></h2><p>在查询到附近的路线后，可以查看其路线详情，并且可以按照该路线运动。实现思路：</p><p>需要记录用户此次运动与目标路线的关系。</p><p>在结束运动时，同时需要标记沿着运动的结束。</p><p>删除路线时，需要将沿着运动的数据删除。（运动时间小于3分钟）</p><h3 id="实体类结构" tabindex="-1">实体类结构 <a class="header-anchor" href="#实体类结构" aria-label="Permalink to &quot;实体类结构&quot;">​</a></h3><p>记录运动与目标路线的关系的实体结构如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131044765.png" alt="image-20230313104449669" style="zoom:80%;"><p>沿着路线开始骑行接口，主要完成2件事情：创建新的路线。记录该路线与目标路线之间的关系。</p><p>接口文档地址：<a href="https://mock-java.itheima.net/project/3051/interface/api/37337" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37337</a></p><p>该接口中需要传递目标路线的id，返回新创建的路线id。</p><p>RouteController中的实现：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131052574.png" alt="image-20230313105228479" style="zoom:80%;"><p>RouteService中的实现：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131052776.png" alt="image-20230313105250678" style="zoom:80%;"><p>RouteService中的updateRoute()方法中增加结束沿着路线骑行的实现：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131053395.png" alt="image-20230313105314309" style="zoom:80%;"><p>RouteService中的deleteRoute()法中增加删除沿着路线骑行的实现：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131053873.png" alt="image-20230313105335781" style="zoom:80%;"><h3 id="查询正在骑行的人" tabindex="-1">查询正在骑行的人 <a class="header-anchor" href="#查询正在骑行的人" aria-label="Permalink to &quot;查询正在骑行的人&quot;">​</a></h3><p>在查询路线时，需要查询出该路线正在骑行的人。</p><p>接口文档地址： <a href="https://mock-java.itheima.net/project/3051/interface/api/37325" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37325</a></p><p>该接口需要传递目标路线id。</p><p>RouteController的实现如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131054407.png" alt="image-20230313105404323" style="zoom:80%;"><h3 id="最终实现效果" tabindex="-1">最终实现效果 <a class="header-anchor" href="#最终实现效果" aria-label="Permalink to &quot;最终实现效果&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131054534.png" alt="image-20230313105427452" style="zoom:80%;"><h2 id="我的历史路线" tabindex="-1">我的历史路线 <a class="header-anchor" href="#我的历史路线" aria-label="Permalink to &quot;我的历史路线&quot;">​</a></h2><p>关于我的历史路线这个模块与地图关系不大，考虑到项目的功能健全性，这部分代码做拷贝整合。</p><p>该功能需要提供2个接口，一个是历史路线列表，另一个是按照日期分组返回历史路线。</p><p>对应的接口文档地址分别是：</p><p>历史路线：<a href="https://mock-java.itheima.net/project/3051/interface/api/37319" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37319</a></p><p>按日期分组展现：<a href="https://mock-java.itheima.net/project/3051/interface/api/37343" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3051/interface/api/37343</a></p><p>参考实现代码在资料中提供。最后需要将查询我的信息中的默认总里程数、运动时间、平均速度等内容。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131051604.png" alt="image-20230313105121469" style="zoom:80%;"><h1 id="物流行业地图" tabindex="-1">物流行业地图 <a class="header-anchor" href="#物流行业地图" aria-label="Permalink to &quot;物流行业地图&quot;">​</a></h1><h2 id="地图技术在物流行业的应用" tabindex="-1">地图技术在物流行业的应用 <a class="header-anchor" href="#地图技术在物流行业的应用" aria-label="Permalink to &quot;地图技术在物流行业的应用&quot;">​</a></h2><h3 id="场景1-智能调度" tabindex="-1">场景1：智能调度 <a class="header-anchor" href="#场景1-智能调度" aria-label="Permalink to &quot;场景1：智能调度&quot;">​</a></h3><blockquote><p>物流调度主要是指在物流过程中,物流公司根据待发货物的重量、去向、规格、加急程度等对所属的车辆和人员进行合理的安排和调度。智能调度系统可以高效、准确的完成这一系列的调度工作。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131008329.png" alt="image-20230313100802226" style="zoom:80%;"><h3 id="场景2-货车轨迹监控" tabindex="-1">场景2：货车轨迹监控 <a class="header-anchor" href="#场景2-货车轨迹监控" aria-label="Permalink to &quot;场景2：货车轨迹监控&quot;">​</a></h3><blockquote><p>解决车辆运行线路相关的问题，包括车辆的线路规划、车辆运行时的电子围栏（线性电子围栏及区域性电子围栏）、车辆运行线路的轨迹纠偏、车辆运行记录的线路补偿。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131008209.png" alt="image-20230313100847066" style="zoom:80%;"><h3 id="场景3-快递员多点路线规划" tabindex="-1">场景3：快递员多点路线规划 <a class="header-anchor" href="#场景3-快递员多点路线规划" aria-label="Permalink to &quot;场景3：快递员多点路线规划&quot;">​</a></h3><blockquote><p>结合批量算路服务，实现快递员派送时的多点路线规划，提升派件效率，结合地图展现，方便、直观。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131009755.png" alt="image-20230313100937633" style="zoom:80%;"><h3 id="场景4-快递分单" tabindex="-1">场景4：快递分单 <a class="header-anchor" href="#场景4-快递分单" aria-label="Permalink to &quot;场景4：快递分单&quot;">​</a></h3><p>通过地址解析的坐标与收派区域结合完成分单。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131010281.png" alt="image-20230313101033185" style="zoom:80%;"><h3 id="场景5-驿站选址" tabindex="-1">场景5：驿站选址 <a class="header-anchor" href="#场景5-驿站选址" aria-label="Permalink to &quot;场景5：驿站选址&quot;">​</a></h3><p>结合地理编码和地点检索，分析订单分布，辅助驿站选址。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131011869.png" alt="image-20230313101113761" style="zoom:80%;"><h2 id="金运物流项目简介" tabindex="-1">金运物流项目简介 <a class="header-anchor" href="#金运物流项目简介" aria-label="Permalink to &quot;金运物流项目简介&quot;">​</a></h2><h3 id="订单管理" tabindex="-1">订单管理 <a class="header-anchor" href="#订单管理" aria-label="Permalink to &quot;订单管理&quot;">​</a></h3><p>订单是在用户在物流系统中下的订单，比如：寄一件衣服从上海到北京。订单管理的列表如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131015521.png" alt="image-20230313101511429" style="zoom:80%;"><h3 id="路线规划" tabindex="-1">路线规划 <a class="header-anchor" href="#路线规划" aria-label="Permalink to &quot;路线规划&quot;">​</a></h3><p>在订单详情中，通过百度地图显示出订单的路线规划：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131015182.png" alt="image-20230313101537051" style="zoom:80%;"><h3 id="运单管理" tabindex="-1">运单管理 <a class="header-anchor" href="#运单管理" aria-label="Permalink to &quot;运单管理&quot;">​</a></h3><p>运单是物流系统为每一个订单生成的运单号，一般是告知用户的，用户根据运单号查询物流状态信息。</p><p>运单管理的列表如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131016739.png" alt="image-20230313101610651" style="zoom:67%;"><p>运单详情中会显示车辆的运行轨迹，如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131016397.png" alt="image-20230313101645289" style="zoom:80%;"><h3 id="电子围栏" tabindex="-1">电子围栏 <a class="header-anchor" href="#电子围栏" aria-label="Permalink to &quot;电子围栏&quot;">​</a></h3><p>通过设置多边形的电子围栏对车辆进行监控，如果超出范围就会进行告警：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131017977.png" alt="image-20230313101713859" style="zoom:80%;"><h3 id="车辆管理" tabindex="-1">车辆管理 <a class="header-anchor" href="#车辆管理" aria-label="Permalink to &quot;车辆管理&quot;">​</a></h3><p>在车辆管理的页面中，如果有车辆超出了电子围栏就会有红色告警显示，如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131017241.png" alt="image-20230313101747155" style="zoom:80%;"><h2 id="搭建工程" tabindex="-1">搭建工程 <a class="header-anchor" href="#搭建工程" aria-label="Permalink to &quot;搭建工程&quot;">​</a></h2><h3 id="前端工程" tabindex="-1">前端工程 <a class="header-anchor" href="#前端工程" aria-label="Permalink to &quot;前端工程&quot;">​</a></h3><p>前端采用Vue编写，我们需要把前端工程跑起来，项目源码在代码目录中。主要步骤如下：</p><blockquote><p>将project-jywl-admin-vue-ts.zip解压到自己的目录中</p><p>在Terminal控制台中输入 npm run serve 命令即可运行（代码包中已经包含了所需要的依赖）</p><p>如果依赖有问题，可以将node_modules目录删除，然后执行npm install 即可。</p><p>可在 .env 文件中修改接口的地址，演示功能效果使用mock地址，开发时使用本地开发地址。</p></blockquote><h3 id="创建mongodb用户" tabindex="-1">创建MongoDB用户 <a class="header-anchor" href="#创建mongodb用户" aria-label="Permalink to &quot;创建MongoDB用户&quot;">​</a></h3><p>为了与前面轻骑项目区分开来，我们在MongoDB中创建jinyun的用户</p><div class="language-sql"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">db.createUser({ </span></span>
<span class="line"><span style="color:#A6ACCD;">     user: </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">jinyun</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">, </span></span>
<span class="line"><span style="color:#A6ACCD;">     pwd: </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">oudqBFGmGY8pU6WS</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">, </span></span>
<span class="line"><span style="color:#A6ACCD;">     roles: [ { role: &quot;readWrite&quot;, db: &quot;jinyun&quot; } ] </span></span>
<span class="line"><span style="color:#A6ACCD;">});</span></span></code></pre></div><h3 id="后端工程" tabindex="-1">后端工程 <a class="header-anchor" href="#后端工程" aria-label="Permalink to &quot;后端工程&quot;">​</a></h3><p>工程的pom.xml、pojo等文件在资料目录中。金运项目中的数据均存储在MongoDB中，地图方面使用百度地图技术</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131020948.png" alt="image-20230313102036859" style="zoom:80%;"><h2 id="订单管理功能开发" tabindex="-1">订单管理功能开发 <a class="header-anchor" href="#订单管理功能开发" aria-label="Permalink to &quot;订单管理功能开发&quot;">​</a></h2><h3 id="构造数据" tabindex="-1">构造数据 <a class="header-anchor" href="#构造数据" aria-label="Permalink to &quot;构造数据&quot;">​</a></h3><p>在提供的测试代码TestOrderService.java文件中，执行测试用例用于生成省、市、区以及订单数据</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131021670.png" alt="image-20230313102116564" style="zoom:80%;"><h3 id="实现订单列表查询" tabindex="-1">实现订单列表查询 <a class="header-anchor" href="#实现订单列表查询" aria-label="Permalink to &quot;实现订单列表查询&quot;">​</a></h3><p>接口文档： <a href="https://mock-java.itheima.net/project/3308/interface/api/41698" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41698</a></p><p>对于该接口的实现，我们只做基本的实现，不根据各种参数进行查询。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131022982.png" alt="image-20230313102249897" style="zoom:80%;"><h3 id="整合到前端的效果" tabindex="-1">整合到前端的效果 <a class="header-anchor" href="#整合到前端的效果" aria-label="Permalink to &quot;整合到前端的效果&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131023733.png" alt="image-20230313102313651" style="zoom:80%;"><h3 id="订单详情" tabindex="-1">订单详情 <a class="header-anchor" href="#订单详情" aria-label="Permalink to &quot;订单详情&quot;">​</a></h3><blockquote><p>接口地址：<a href="https://mock-java.itheima.net/project/3308/interface/api/41700" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41700</a></p></blockquote><blockquote><p>根据订单号查询订单数据，在订单详情中，前端根据订单数据中发件人地址与收件人地址，在地图显示路线规划</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131024348.png" alt="image-20230313102402261" style="zoom:80%;"><h3 id="整合到前端的效果-1" tabindex="-1">整合到前端的效果 <a class="header-anchor" href="#整合到前端的效果-1" aria-label="Permalink to &quot;整合到前端的效果&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131024934.png" alt="image-20230313102443812" style="zoom:67%;"><h2 id="运单管理功能开发" tabindex="-1">运单管理功能开发 <a class="header-anchor" href="#运单管理功能开发" aria-label="Permalink to &quot;运单管理功能开发&quot;">​</a></h2><h3 id="构造数据-1" tabindex="-1">构造数据 <a class="header-anchor" href="#构造数据-1" aria-label="Permalink to &quot;构造数据&quot;">​</a></h3><p>在提供的测试代码TestWayBillService.java文件中，执行测试用例生成运单数据。</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131025439.png" alt="image-20230313102525364"></p><h3 id="运单列表" tabindex="-1">运单列表 <a class="header-anchor" href="#运单列表" aria-label="Permalink to &quot;运单列表&quot;">​</a></h3><p>接口地址：<a href="https://mock-java.itheima.net/project/3308/interface/api/41702" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41702</a></p><p>按照分页的方式查询运单数据，简单实现，不进行多条件查询的实现。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131025228.png" alt="image-20230313102559147" style="zoom:80%;"><h3 id="运单详情" tabindex="-1">运单详情 <a class="header-anchor" href="#运单详情" aria-label="Permalink to &quot;运单详情&quot;">​</a></h3><p>接口地址：<a href="https://mock-java.itheima.net/project/3308/interface/api/41704" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41704</a></p><p>该接口返回运单的详细信息。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131026124.png" alt="image-20230313102640041" style="zoom:67%;"><h3 id="运单轨迹" tabindex="-1">运单轨迹 <a class="header-anchor" href="#运单轨迹" aria-label="Permalink to &quot;运单轨迹&quot;">​</a></h3><p>接口地址：<a href="https://mock-java.itheima.net/project/3308/interface/api/41706" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41706</a></p><p>该接口返回发件人地址与收件人地址之间的车辆路线规划的坐标数据。</p><p>实现要点如下：</p><blockquote><p>根据百度地图API查询收件人的地址对应的经纬度坐标值。</p><p>根据百度地图API查询发件人的地址对应的经纬度坐标值。</p><p>调用百度地图API查询2点间的路线规划。</p><p>路线规划中可以设置途经点，如：收货地址如果是上海，必须途径南京。</p></blockquote><h3 id="运单轨迹效果-有途经点" tabindex="-1">运单轨迹效果（有途经点） <a class="header-anchor" href="#运单轨迹效果-有途经点" aria-label="Permalink to &quot;运单轨迹效果（有途经点）&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131027334.png" alt="image-20230313102745196" style="zoom:80%;"><h3 id="运单轨迹效果-无途经点" tabindex="-1">运单轨迹效果（无途经点） <a class="header-anchor" href="#运单轨迹效果-无途经点" aria-label="Permalink to &quot;运单轨迹效果（无途经点）&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131028142.png" alt="image-20230313102808012" style="zoom:80%;"><h2 id="电子围栏功能开发" tabindex="-1">电子围栏功能开发 <a class="header-anchor" href="#电子围栏功能开发" aria-label="Permalink to &quot;电子围栏功能开发&quot;">​</a></h2><h3 id="新增电子围栏" tabindex="-1">新增电子围栏 <a class="header-anchor" href="#新增电子围栏" aria-label="Permalink to &quot;新增电子围栏&quot;">​</a></h3><blockquote><p>电子围栏的主要用途是监控车辆是否超出规定的范围，如果超出需要有异常的状态信息。</p><p>电子围栏需要使用到百度地图鹰眼服务中的服务，并在围栏数据也需要在本地存储。</p><p>百度地图文档地址：<a href="https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/geofence" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/geofence</a></p></blockquote><p>百度地图电子围栏支持圆形、多边形、路线、行政区类型的围栏，在项目中我们只演示多边形围栏的使用，其他类似</p><blockquote><p>围栏面积如果超过100平方公里，就需要付费申请开通权限。</p><p>接口地址：<a href="https://mock-java.itheima.net/project/3308/interface/api/41710" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41710</a></p><p>接口提交的参数有围栏名称以及多边形坐标数据。</p></blockquote><h3 id="实现要点" tabindex="-1">实现要点 <a class="header-anchor" href="#实现要点" aria-label="Permalink to &quot;实现要点&quot;">​</a></h3><p>通过集合接收提交的多边形坐标。先创建百度地图的电子围栏，创建成功后再将围栏数据写入到MongoDB中。</p><p>写入MongoDB中数据如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131030131.png" alt="image-20230313103011058" style="zoom:67%;"><h3 id="功能列表" tabindex="-1">功能列表 <a class="header-anchor" href="#功能列表" aria-label="Permalink to &quot;功能列表&quot;">​</a></h3><p>电子围栏列表分2个接口，一个是在列表管理页面中使用，一个是在新增车辆时使用。</p><p>电子围栏分页列表接口： <a href="https://mock-java.itheima.net/project/3308/interface/api/41712" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41712</a></p><p>电子围栏列表： <a href="https://mock-java.itheima.net/project/3308/interface/api/41714" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41714</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131030233.png" alt="image-20230313103050124" style="zoom:80%;"><h3 id="详情" tabindex="-1">详情 <a class="header-anchor" href="#详情" aria-label="Permalink to &quot;详情&quot;">​</a></h3><p>根据id查询电子围栏详情，返回多边形坐标数据，在地图上将电子围栏展现出来。</p><p>接口地址： <a href="https://mock-java.itheima.net/project/3308/interface/api/41718" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41718</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131031605.png" alt="image-20230313103120500" style="zoom:80%;"><h3 id="修改" tabindex="-1">修改 <a class="header-anchor" href="#修改" aria-label="Permalink to &quot;修改&quot;">​</a></h3><p>修改电子围栏需要将坐标重新提交，更新到百度地图与MongoDB数据库。</p><p>百度地图API接口：<a href="https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/geofence" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/geofence#service-page-anchor8</a></p><p>接口地址：<a href="https://mock-java.itheima.net/project/3308/interface/api/41708" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41708</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131031162.png" alt="image-20230313103154075" style="zoom:80%;"><h3 id="删除" tabindex="-1">删除 <a class="header-anchor" href="#删除" aria-label="Permalink to &quot;删除&quot;">​</a></h3><p>删除电子围栏需要将百度地图以及MongoDB中的围栏数据均删除。</p><p>百度地图API接口：<a href="https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/geofence" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/geofence#service-page-anchor11</a></p><p>接口地址：<a href="https://mock-java.itheima.net/project/3308/interface/api/41716" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41716</a></p><h2 id="车辆管理功能开发" tabindex="-1">车辆管理功能开发 <a class="header-anchor" href="#车辆管理功能开发" aria-label="Permalink to &quot;车辆管理功能开发&quot;">​</a></h2><h3 id="车辆列表" tabindex="-1">车辆列表 <a class="header-anchor" href="#车辆列表" aria-label="Permalink to &quot;车辆列表&quot;">​</a></h3><p>查询车辆列表时，需要查询百度鹰眼服务，判断车辆是否有超出电子围栏。</p><p>百度鹰眼服务地址：<a href="https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/geofencealarm" target="_blank" rel="noreferrer">https://lbsyun.baidu.com/index.php?title=yingyan/api/v3/geofencealarm#service-page-anchor4</a></p><p>接口地址：<a href="https://mock-java.itheima.net/project/3308/interface/api/41726" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41726</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131032254.png" alt="image-20230313103252170" style="zoom:80%;"><h3 id="新增车辆" tabindex="-1">新增车辆 <a class="header-anchor" href="#新增车辆" aria-label="Permalink to &quot;新增车辆&quot;">​</a></h3><p>新增车辆时需要将车辆作为Entity注册到百度鹰眼服务中，并且将其加入到电子围栏中。</p><p>百度地图鹰眼Entity新增成功后，需要将车辆数据存储到MongoDB表tb_vehicle中。</p><p>接口地址： <a href="https://mock-java.itheima.net/project/3308/interface/api/41724" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41724</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131033242.png" alt="image-20230313103340155" style="zoom:80%;"><h3 id="车辆详情" tabindex="-1">车辆详情 <a class="header-anchor" href="#车辆详情" aria-label="Permalink to &quot;车辆详情&quot;">​</a></h3><p>查询车辆的详细信息。</p><p>接口文档：<a href="https://mock-java.itheima.net/project/3308/interface/api/41728" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41728</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131034521.png" alt="image-20230313103415451" style="zoom:80%;"><h3 id="车辆删除" tabindex="-1">车辆删除 <a class="header-anchor" href="#车辆删除" aria-label="Permalink to &quot;车辆删除&quot;">​</a></h3><p>删除车辆信息，同时要删除百度鹰眼服务中的Entity和MongoDB中的车辆数据。</p><p>接口文档：<a href="https://mock-java.itheima.net/project/3308/interface/api/41722" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41722</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131034611.png" alt="image-20230313103446540" style="zoom:80%;"><h3 id="车辆更新" tabindex="-1">车辆更新 <a class="header-anchor" href="#车辆更新" aria-label="Permalink to &quot;车辆更新&quot;">​</a></h3><p>更新车辆信息。</p><p>接口文档：<a href="https://mock-java.itheima.net/project/3308/interface/api/41720" target="_blank" rel="noreferrer">https://mock-java.itheima.net/project/3308/interface/api/41720</a></p><p>如果车辆关联的电子围栏变更的话：在原有的电子围栏中将该车辆删除，将该车辆加入新的电子围栏中</p><h1 id="地图数据收集与存储" tabindex="-1">地图数据收集与存储 <a class="header-anchor" href="#地图数据收集与存储" aria-label="Permalink to &quot;地图数据收集与存储&quot;">​</a></h1><h2 id="地图数据收集与存储方案分析" tabindex="-1">地图数据收集与存储方案分析 <a class="header-anchor" href="#地图数据收集与存储方案分析" aria-label="Permalink to &quot;地图数据收集与存储方案分析&quot;">​</a></h2><h3 id="问题引出和困难分析" tabindex="-1">问题引出和困难分析 <a class="header-anchor" href="#问题引出和困难分析" aria-label="Permalink to &quot;问题引出和困难分析&quot;">​</a></h3><p>如果不使用百度地图鹰眼服务，我们该如何存储轨迹坐标数据？自己存储轨迹坐标数据面临的困难主要有两个：</p><blockquote><p>第一，高并发上报地理位置的请求如何解决?</p><p>第二，海量的坐标数据该如何存储?</p></blockquote><p>针对以上问题我们给出相应的解决方案，这也就是今天课程的主要内容。</p><h3 id="解决高并发的解决方案" tabindex="-1">解决高并发的解决方案 <a class="header-anchor" href="#解决高并发的解决方案" aria-label="Permalink to &quot;解决高并发的解决方案&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130923830.png" alt="image-20230313092310722" style="zoom:80%;"><p>关于上图的说明如下：</p><blockquote><p>客户端可能会有多种，可以是移动端APP、微信小程序、浏览器等。</p><p>客户端一般会发送http请求，为了高效的处理用户请求，我们采用Netty来处理用户的请求。</p><p>Netty是一个<strong>高性能的、异步的、基于事件驱动的网络应用框架</strong>。</p><p>Netty服务在接收到请求后，自己并不完成数据存储的工作，而是将数据发送给Kafka消息服务器。</p><p>这样做的好处，Netty服务可以更快速给用户响应，自己的变得更加轻量化。</p><p>Kafka 是一个开源消息系统，是Apache 软件基金会开发的一个开源消息系统项目。</p><p><strong>该项目的目标是为处理实时数据提供一个统一、高通量、低延迟的平台</strong>。</p></blockquote><h3 id="海量数据存储的解决方案" tabindex="-1">海量数据存储的解决方案 <a class="header-anchor" href="#海量数据存储的解决方案" aria-label="Permalink to &quot;海量数据存储的解决方案&quot;">​</a></h3><p>如果不使用百度地图鹰眼服务，我们该如何存储轨迹坐标数据？</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130925815.png" alt="image-20230313092531707" style="zoom:67%;"><h2 id="netty快速入门" tabindex="-1">Netty快速入门 <a class="header-anchor" href="#netty快速入门" aria-label="Permalink to &quot;Netty快速入门&quot;">​</a></h2><h3 id="netty简介" tabindex="-1">Netty简介 <a class="header-anchor" href="#netty简介" aria-label="Permalink to &quot;Netty简介&quot;">​</a></h3><blockquote><p>Netty是一个高性能的、异步的、基于事件驱动的网络应用框架。官网：<a href="https://netty.io/" target="_blank" rel="noreferrer">https://netty.io/</a></p><p>Netty是基于Java的NIO实现的，Netty将各种传输类型、协议的实现API进行了统一封装，实现阻塞和非阻塞Socket</p><p>Netty在网络通信方面更加的高性能、低延迟，尽可能的减少不必要的内存拷贝，提高性能。</p><p>Netty只依赖了JDK底层api，没有其他的依赖，如：Netty 3.X依赖JDK5以上，Netty4.x依赖JDK6以上。</p><p>Netty的社区比较活跃，版本迭代周期短，发现bug可以快速修复，新版本也会不断的加入。</p></blockquote><h3 id="核心架构" tabindex="-1">核心架构 <a class="header-anchor" href="#核心架构" aria-label="Permalink to &quot;核心架构&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130928360.png" alt="image-20230313092815205" style="zoom:80%;"><h3 id="版本说明" tabindex="-1">版本说明 <a class="header-anchor" href="#版本说明" aria-label="Permalink to &quot;版本说明&quot;">​</a></h3><blockquote><p>Netty的版本分为，3.x、4.x和5.x，其中5.x版本已经被官方废弃。目前Netty的最新版本为4.1.66.Final，我们将基于此版本学习。</p></blockquote><blockquote><p>废弃5.x的主要原因是，使用ForkJoinPool后复杂度提升了，但是性能方面并没有明显的优势，反而给项目的维护带来了很大的工作量，因此还有到发布新版本的时机，所以将5.x废弃。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130931670.png" alt="image-20230313093147586" style="zoom:80%;"><h3 id="应用场景" tabindex="-1">应用场景 <a class="header-anchor" href="#应用场景" aria-label="Permalink to &quot;应用场景&quot;">​</a></h3><p>Netty的应用场景是非常广泛的，比如：互联网行业的、游戏行业、大数据行业、医疗行业、金融等行业。</p><blockquote><p>在互联网行业项目中，最具代表性的就是分布式系统架构的远程服务调用，通过RPC的方式进行高性能的服务调用，目前主流的RPC框架底层均采用了Netty作为网络通信组件。</p></blockquote><blockquote><p>比如：阿里巴巴的分布式服务治理框架Dubbo，底层就是使用Netty作为通信组件。</p></blockquote><blockquote><p>gRPC，是Google提供的高性能RPC框架，底层也使用了Netty。</p></blockquote><blockquote><p>大数据行业中的许多技术也采用了Netty作为通信组件，如：Flink、Spark、Elasticsearch等。官方列出了使用Netty的一些项目：<a href="https://netty.io/wiki/related-projects.html" target="_blank" rel="noreferrer">https://netty.io/wiki/related-projects.html</a></p></blockquote><h3 id="reactor线程模型" tabindex="-1">Reactor线程模型 <a class="header-anchor" href="#reactor线程模型" aria-label="Permalink to &quot;Reactor线程模型&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130934490.png" alt="image-20230313093435387" style="zoom:80%;"><h3 id="单reactor单线程模型" tabindex="-1">单Reactor单线程模型 <a class="header-anchor" href="#单reactor单线程模型" aria-label="Permalink to &quot;单Reactor单线程模型&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130942044.png" alt="image-20230313094214952" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130942624.png" alt="image-20230313094248545" style="zoom:80%;"><h3 id="单reactor多线程模型" tabindex="-1">单Reactor多线程模型 <a class="header-anchor" href="#单reactor多线程模型" aria-label="Permalink to &quot;单Reactor多线程模型&quot;">​</a></h3><blockquote><p>在Reactor多线程模型相比较单线程模型而言，不同点在于，Handler不会处理业务逻辑，只是负责响应用户请求，真正的业务逻辑，在另外的线程中完成。</p></blockquote><blockquote><p>这样可以降低Reactor的性能开销，充分利用CPU资源，从而更专注的做事件分发工作了，提升整个应用的吞吐。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130943371.png" alt="image-20230313094335297" style="zoom:80%;"><p>存在的问题</p><blockquote><p>多线程数据共享和访问比较复杂。如果子线程完成业务处理后，把结果传递给主线程Reactor进行发送，就会涉及共享数据的互斥和保护机制。</p></blockquote><blockquote><p>Reactor承担所有事件的监听和响应，只在主线程中运行，可能会存在性能问题。例如并发百万客户端连接，或者服务端需要对客户端握手进行安全认证，但是认证本身非常损耗性能。</p></blockquote><h3 id="主从reactor多线程模型" tabindex="-1">主从Reactor多线程模型 <a class="header-anchor" href="#主从reactor多线程模型" aria-label="Permalink to &quot;主从Reactor多线程模型&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130946231.png" alt="image-20230313094621143" style="zoom:80%;"><p>在主从模型中，将Reactor分成2部分：</p><p>MainReactor负责监听server socket，用来处理网络IO连接建立操作，将建立的socketChannel指定注册给SubReactor。</p><p>SubReactor主要完成和建立起来的socket的数据交互和事件业务处理操作。</p><h3 id="netty模型" tabindex="-1">Netty模型 <a class="header-anchor" href="#netty模型" aria-label="Permalink to &quot;Netty模型&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130946983.png" alt="image-20230313094658906" style="zoom:80%;"><p>在Netty模型中，负责处理新连接事件的是BossGroup，负责处理其他事件的是WorkGroup。Group就是线程池的概念。</p><p>NioEventLoop表示一个不断循环的执行处理任务的线程，用于监听绑定在其上的读/写事件。</p><p>通过Pipeline（管道）执行业务逻辑的处理，Pipeline中会有多个ChannelHandler，真正的业务逻辑是在ChannelHandler中完成的。</p><h3 id="实例-使用netty实现socket服务" tabindex="-1">实例：使用Netty实现socket服务 <a class="header-anchor" href="#实例-使用netty实现socket服务" aria-label="Permalink to &quot;实例：使用Netty实现socket服务&quot;">​</a></h3><blockquote><p>使用Netty既可以编写服务端，也可以编写客户端，但是我们学习的重点是服务端的实现。</p></blockquote><p>下面我们将使用Netty实现简单的socket服务端，具体实现功能如下：</p><blockquote><p>服务端启动后，监听6666端口，服务端接收到请求后，在控制台将接收到的数据打印出来，最后给客户端响应”ok”</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130949397.png" alt="image-20230313094915331" style="zoom:80%;"><h3 id="netty编解码器-了解" tabindex="-1">Netty编解码器（了解） <a class="header-anchor" href="#netty编解码器-了解" aria-label="Permalink to &quot;Netty编解码器（了解）&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130950265.png" alt="image-20230313095041156" style="zoom:80%;"><h2 id="部署kafka集群" tabindex="-1">部署kafka集群 <a class="header-anchor" href="#部署kafka集群" aria-label="Permalink to &quot;部署kafka集群&quot;">​</a></h2><blockquote><p>参考资料中的《部署kafka集群.md》文档，进行部署。通过kafka manager进行管理、查看集群信息。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130952837.png" alt="image-20230313095220753" style="zoom:80%;"><h2 id="实现地图数据的收集方案" tabindex="-1">实现地图数据的收集方案 <a class="header-anchor" href="#实现地图数据的收集方案" aria-label="Permalink to &quot;实现地图数据的收集方案&quot;">​</a></h2><p>下面我们将通过Netty、Kafka实现高性能的服务端应用，主要是步骤如下：</p><blockquote><p>创建my-geoserver工程，导入所需的依赖包。</p><p>编写配置文件my.setting，通过hutool工具包中的Setting类型读取配置文件信息。</p><p>编写MyGeoHttpServer类，负责启动Netty服务，添加http相关的编解码器。</p><p>编写ServerHandler类，负责接收用户请求，以及发送kafka消息。</p><p>编写KafkaService类，完成发送kafka消息的业务逻辑。</p></blockquote><h2 id="mongodb分片式集群" tabindex="-1">MongoDB分片式集群 <a class="header-anchor" href="#mongodb分片式集群" aria-label="Permalink to &quot;MongoDB分片式集群&quot;">​</a></h2><h3 id="集群介绍" tabindex="-1">集群介绍 <a class="header-anchor" href="#集群介绍" aria-label="Permalink to &quot;集群介绍&quot;">​</a></h3><blockquote><p>分片（sharding）是MongoDB用来将大型集合分割到不同服务器（或者说一个集群）上所采用的方法。</p></blockquote><blockquote><p>使用分片减少了每个分片需要处理的请求数，通过水平扩展，集群可以提高自己的存储容量和吞吐量。</p></blockquote><blockquote><p>例如，如果数据库1tb的数据集，并有4个分片，然后每个分片可能仅持有256 GB的数据。如果有40个分片，那么每个切分可能只有25GB的数据。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130954189.png" alt="image-20230313095451085" style="zoom:67%;"><h3 id="分片集群的优势" tabindex="-1">分片集群的优势 <a class="header-anchor" href="#分片集群的优势" aria-label="Permalink to &quot;分片集群的优势&quot;">​</a></h3><blockquote><p>MongoDB自带了一个叫做mongos的专有路由进程。mongos就是掌握统一路口的路由器，其会将客户端发来的请求准确无误的路由到集群中的一个或者一组服务器上，同时会把接收到的响应拼装起来发回到客户端。</p></blockquote><blockquote><p>保证集群总是可读写，将MongoDB的分片和复制功能结合使用，在确保数据分片到多台服务器的同时，也确保了每分数据都有相应的备份，这样就可以确保有服务器坏掉时，其他的从库可以立即接替坏掉的部分继续工作。</p></blockquote><blockquote><p>集群易于扩展，当系统需要更多的空间和资源的时候，MongoDB使我们可以按需方便的扩充系统容量。</p></blockquote><h3 id="分片集群的架构" tabindex="-1">分片集群的架构 <a class="header-anchor" href="#分片集群的架构" aria-label="Permalink to &quot;分片集群的架构&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130956292.png" alt="image-20230313095645186" style="zoom:80%;"><h3 id="集群中的数据分布" tabindex="-1">集群中的数据分布 <a class="header-anchor" href="#集群中的数据分布" aria-label="Permalink to &quot;集群中的数据分布&quot;">​</a></h3><blockquote><p>在一个shard server内部，MongoDB会把数据分为chunks，每个chunk代表这个shard server内部一部分数据。chunk的产生，会有以下两个用途：</p></blockquote><blockquote><p>Splitting：当一个chunk的大小超过配置中的chunk size（默认64M）时，MongoDB的后台进程会把这个chunk切分成更小的chunk，从而避免chunk过大的情况。</p></blockquote><blockquote><p>Balancing：balancer是一个后台进程，负责chunk的迁移，从而均衡各个shard server的负载，系统初始1个chunk，mongoDB会自动拆分和迁移chunks。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130958366.png" alt="image-20230313095810273" style="zoom:80%;"><h3 id="搭建分片式集群" tabindex="-1">搭建分片式集群 <a class="header-anchor" href="#搭建分片式集群" aria-label="Permalink to &quot;搭建分片式集群&quot;">​</a></h3><blockquote><p>下面我们搭建一个分片式的集群，包括：1个Mongos服务，3个Config Server，2个Shard，每个Shard中包含3个MongoDB实例，其为副本集，保障数据的安全。具体方法参考《搭建MongoDB分片式集群.md》文档。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130959724.png" alt="image-20230313095906636" style="zoom:80%;"><h2 id="接收消息存储到mongodb" tabindex="-1">接收消息存储到MongoDB <a class="header-anchor" href="#接收消息存储到mongodb" aria-label="Permalink to &quot;接收消息存储到MongoDB&quot;">​</a></h2><p>下面我们完成接收消息，并且存储数据到MongoDB的逻辑，主要的步骤如下：</p><blockquote><p>导入my-geoserver-consumer工程。</p><p>RoutePoint实体类，其中存储了用户的地理位置数据。</p><p>GeoServerConsumer类，接收消息并且存储到MongoDB。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303131000912.png" alt="image-20230313100040828" style="zoom:80%;"><h2 id="压力测试" tabindex="-1">压力测试 <a class="header-anchor" href="#压力测试" aria-label="Permalink to &quot;压力测试&quot;">​</a></h2><h3 id="安装jmeter" tabindex="-1">安装JMeter <a class="header-anchor" href="#安装jmeter" aria-label="Permalink to &quot;安装JMeter&quot;">​</a></h3><blockquote><p>将资料目录中的apache-jmeter-5.4.1.tgz压缩包解压到任意目录，双击在bin目录下的jmeter.bat启动即可。</p><p>按照下图创建测试用例：</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130935069.png" alt="image-20230313093554008" style="zoom:80%;"><h3 id="jmeter-–-线程组" tabindex="-1">Jmeter – 线程组 <a class="header-anchor" href="#jmeter-–-线程组" aria-label="Permalink to &quot;Jmeter – 线程组&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130937534.png" alt="image-20230313093757450" style="zoom:80%;"><h3 id="jmeter–-http请求设置" tabindex="-1">Jmeter– http请求设置 <a class="header-anchor" href="#jmeter–-http请求设置" aria-label="Permalink to &quot;Jmeter– http请求设置&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130938880.png" alt="image-20230313093853793" style="zoom:80%;"><h3 id="测试结果" tabindex="-1">测试结果 <a class="header-anchor" href="#测试结果" aria-label="Permalink to &quot;测试结果&quot;">​</a></h3><blockquote><p>由于硬件条件的限制，只是针对单点服务进行测试。</p><p>从测试结论可以看出，通过Netty实现的服务可以应对高并发的场景。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130940346.png" alt="image-20230313094032258" style="zoom:80%;"><h1 id="地图专题面试" tabindex="-1">地图专题面试 <a class="header-anchor" href="#地图专题面试" aria-label="Permalink to &quot;地图专题面试&quot;">​</a></h1><h2 id="_1、百度地图基础api" tabindex="-1">1、百度地图基础API <a class="header-anchor" href="#_1、百度地图基础api" aria-label="Permalink to &quot;1、百度地图基础API&quot;">​</a></h2><p>百度地图基础API的主要功能如下：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915654.png" alt="image-20211014161606793"></p><p>创建地图</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915665.png" alt="image-20211014162515800"></p><p>添加覆盖物</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915687.png" alt="image-20211014162537000"></p><p>地图事件</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915699.png" alt="image-20211014162549002"></p><p>地图样式</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915716.png" alt="image-20211014162602264"></p><p>地图检索</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915709.png" alt="image-20211014162624958"></p><p>数据可视化</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915127.png" alt="image-20211014162634345"></p><p>地点输入提示</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915453.png" alt="image-20211014164031057"></p><p>路线规划</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915567.png" alt="image-20211014164428915"></p><h2 id="_2、百度地图鹰眼轨迹服务" tabindex="-1">2、百度地图鹰眼轨迹服务 <a class="header-anchor" href="#_2、百度地图鹰眼轨迹服务" aria-label="Permalink to &quot;2、百度地图鹰眼轨迹服务&quot;">​</a></h2><p>鹰眼是一套轨迹管理服务，提供各端SDK和API供开发者便捷接入，追踪所管理的车辆/人员等运动物体。</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915680.png" alt="image-20211014174128010"></p><p>主要功能：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915804.png" alt="image-20211014174650886"></p><h2 id="_3、地图找房" tabindex="-1">3、地图找房 <a class="header-anchor" href="#_3、地图找房" aria-label="Permalink to &quot;3、地图找房&quot;">​</a></h2><p>业务流程：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915916.png" alt="image-20211014171907845"></p><p>效果：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915028.png" alt="image-20211014173446986"></p><h2 id="_4、轻骑项目" tabindex="-1">4、轻骑项目 <a class="header-anchor" href="#_4、轻骑项目" aria-label="Permalink to &quot;4、轻骑项目&quot;">​</a></h2><h3 id="_1、小程序授权登录" tabindex="-1">1、小程序授权登录 <a class="header-anchor" href="#_1、小程序授权登录" aria-label="Permalink to &quot;1、小程序授权登录&quot;">​</a></h3><p>小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识，快速建立小程序内的用户体系。</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915138.png" alt="image-20211015100312787"></p><h3 id="_2、骑行功能" tabindex="-1">2、骑行功能 <a class="header-anchor" href="#_2、骑行功能" aria-label="Permalink to &quot;2、骑行功能&quot;">​</a></h3><p>开始骑行：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915170.png" alt="image-20211015102015362"></p><p>停止骑行：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915427.png" alt="image-20211015102047848"></p><h3 id="_3、上报地理位置" tabindex="-1">3、上报地理位置 <a class="header-anchor" href="#_3、上报地理位置" aria-label="Permalink to &quot;3、上报地理位置&quot;">​</a></h3><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915466.png" alt="image-20211015112651519"></p><h2 id="_5、金运物流项目" tabindex="-1">5、金运物流项目 <a class="header-anchor" href="#_5、金运物流项目" aria-label="Permalink to &quot;5、金运物流项目&quot;">​</a></h2><h3 id="_1、订单管理" tabindex="-1">1、订单管理 <a class="header-anchor" href="#_1、订单管理" aria-label="Permalink to &quot;1、订单管理&quot;">​</a></h3><p>在订单管理功能中，主要是为前端提供起始位置，前端通过js调用百度地图api规划路线。</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915576.png" alt="image-20211015113810549"></p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915676.png" alt="image-20211015113816822"></p><h3 id="_2、运单管理" tabindex="-1">2、运单管理 <a class="header-anchor" href="#_2、运单管理" aria-label="Permalink to &quot;2、运单管理&quot;">​</a></h3><p>运单管理中的轨迹是通过后端实现的，并且可以添加途经点。</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915716.png" alt="image-20211015114058791"></p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915891.png" alt="image-20211015114106395"></p><h3 id="_3、电子围栏" tabindex="-1">3、电子围栏 <a class="header-anchor" href="#_3、电子围栏" aria-label="Permalink to &quot;3、电子围栏&quot;">​</a></h3><p>通过设置多边形的电子围栏对车辆进行监控，如果超出范围就会进行告警。</p><blockquote><p><strong>原理：在百度地图中创建电子围栏，车辆作为Entity添加到围栏中进行监控。</strong></p></blockquote><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915004.png" alt="image-20211015141012206"></p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915042.png" alt="image-20211015141040905"></p><h2 id="_6、高并发解决方案" tabindex="-1">6、高并发解决方案 <a class="header-anchor" href="#_6、高并发解决方案" aria-label="Permalink to &quot;6、高并发解决方案&quot;">​</a></h2><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915333.png" alt="image-20211015154514155"></p><p>高并发的解决方案，核心是采用Netty作为服务端接收用户请求，然后将数据发送到Kafka集群。</p><h2 id="_7、海量数据存储解决方案" tabindex="-1">7、海量数据存储解决方案 <a class="header-anchor" href="#_7、海量数据存储解决方案" aria-label="Permalink to &quot;7、海量数据存储解决方案&quot;">​</a></h2><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130915393.png" alt="image-20211015155818478"></p><p>海量数据的存储方案，核心是采用Mongodb分片式集群进行数据存储。</p><h1 id="探花交友面试" tabindex="-1">探花交友面试 <a class="header-anchor" href="#探花交友面试" aria-label="Permalink to &quot;探花交友面试&quot;">​</a></h1><h2 id="_1、项目中使用了哪些技术" tabindex="-1">1、项目中使用了哪些技术 <a class="header-anchor" href="#_1、项目中使用了哪些技术" aria-label="Permalink to &quot;1、项目中使用了哪些技术&quot;">​</a></h2><p>我们开发的探花交友项目中使用的技术相对还是比较多的：</p><blockquote><ul><li><p>前端主要是使用flutter由前端团队完成</p></li><li><p>后端主要使用的技术是Spring Boot + SpringMVC + Mybatis + MybatisPlus + Dubbo，其中服务的注册中心与配置中心使用的是Nacos</p></li><li><p>底层数据的存储使用的是MySQL+MongoDB，缓存使用的是Redis</p></li><li><p>第三方的服务有：阿里云的OSS和短信服务、环信即时通讯、百度人脸识别等，在这个项目中，通过Spark + MLlib实现了智能推荐。</p></li></ul></blockquote><h2 id="_2、前后端分离开发你们是怎么做的" tabindex="-1">2、前后端分离开发你们是怎么做的 <a class="header-anchor" href="#_2、前后端分离开发你们是怎么做的" aria-label="Permalink to &quot;2、前后端分离开发你们是怎么做的&quot;">​</a></h2><p>探花交友项目采用前后端分离的方式开发，就是前端由前端团队负责开发，后端负责接口的开发。</p><p>我们要和前端团队事先约定好接口地址以及各种参数、响应数据结构等。</p><p>对于接口的定义我们采用YApi进行管理，YApi是一个开源的接口定义、管理、提供mock数据的管理平台。</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904495.png" alt="image-20211101102314329"></p><p>接口定义：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904461.png" alt="image-20211101102323929"></p><h2 id="_3、为什么选择mongodb" tabindex="-1">3、为什么选择MongoDB <a class="header-anchor" href="#_3、为什么选择mongodb" aria-label="Permalink to &quot;3、为什么选择MongoDB&quot;">​</a></h2><blockquote><p>之所以选择MongoDB是因为它天生就支持海量数据的存储，可以很好的水平扩容，虽然它不能像传统的关系型数据库那样进行多表联合查询，但对我们的业务而言单表操作足够了。</p></blockquote><blockquote><p>在MongoDB中，我们会存储好友关系、用户发表的动态、推荐的结果等数据。对于MongoDB的集群而且，我们采用了它的分片式集群，这种集群方式有很好的扩展性，使用层面是直接连接到mongos服务即可完成集群的操作</p></blockquote><blockquote><p>说明：如果要继续答分片式集群的话请参考课件中的知识模块。</p></blockquote><h2 id="_4、你们项目的maven模块是怎么设计的" tabindex="-1">4、你们项目的Maven模块是怎么设计的 <a class="header-anchor" href="#_4、你们项目的maven模块是怎么设计的" aria-label="Permalink to &quot;4、你们项目的Maven模块是怎么设计的&quot;">​</a></h2><blockquote><p>我们整体项目使用Maven架构搭建，采用聚合工程形式管理模块，为了便于调用，dubbo需要拆分为接口模块和服务模块，模块划分如下：</p></blockquote><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904509.png" alt="image-20211101104543532"></p><p>工程结构如下：</p><table><thead><tr><th><strong>父工程</strong></th><th><strong>工程名称</strong></th><th><strong>说明</strong></th></tr></thead><tbody><tr><td>tanhua</td><td>tanhua-autoconfig</td><td>自动装配的工具类</td></tr><tr><td>tanhua</td><td>tanhua-domain</td><td>实体类模块</td></tr><tr><td>tanhua</td><td>tanhua-dubbo</td><td>Dubbo子模块（可以理解为文件夹，管理dubbo模块）</td></tr><tr><td>tanhua</td><td>tanhua-app</td><td>与手机端交互的入口模块</td></tr><tr><td>tanhua-dubbo</td><td>tanhua-dubbo-interface</td><td>Dubbo接口模块</td></tr><tr><td>tanhua-dubbo</td><td>tanhua-dubbo-db</td><td>Dubbo服务模块（数据库部分）</td></tr><tr><td>tanhua-dubbo</td><td>tanhua-dubbo-mongo</td><td>Dubbo服务模块（MongoDB部分）</td></tr></tbody></table><p>模块之间的依赖关系如下：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904516.png" alt="image-20211101104803855"></p><h2 id="_5、短信是怎么发送的-发送失败怎么处理" tabindex="-1">5、短信是怎么发送的？发送失败怎么处理 <a class="header-anchor" href="#_5、短信是怎么发送的-发送失败怎么处理" aria-label="Permalink to &quot;5、短信是怎么发送的？发送失败怎么处理&quot;">​</a></h2><blockquote><p>项目中的短信是通过阿里云的短信服务发送的，之所以选择阿里云是由于它相对比较稳定，由于我们发送量并不是很大，所以我们只接入了这一个通道，如果后期量大的了话会考虑接入多个通道来确保短信服务的稳定性。</p></blockquote><p>如果短信发送失败的话，我们会这样处理：</p><blockquote><ul><li>首先，我们的发送短信的代码是做了重试功能的，这样基本可以确保网络故障的场景下能恢复发送</li><li>如果重试3次后依然出错的话，应该是通道或账号出现了问题，我们会将错误记录到日志中，会有后续的日志监控进行监控，及时的发现问题并解决问题。</li></ul></blockquote><h2 id="_6、使用过jwt吗-它是如何确保安全的" tabindex="-1">6、使用过JWT吗，它是如何确保安全的 <a class="header-anchor" href="#_6、使用过jwt吗-它是如何确保安全的" aria-label="Permalink to &quot;6、使用过JWT吗，它是如何确保安全的&quot;">​</a></h2><blockquote><p>我们项目中，用户在登录成功后系统会生成token，这个token就是采用JWT生成的。</p></blockquote><blockquote><p>JWT就是一个字符串，经过加密处理与校验处理的字符串，形式为：A.B.C，其中，A是JWT头部信息header加密得到的，B是JWT用到的身份验证信息json数据加密得到，C是A和B加密得到，是校验部分。</p></blockquote><blockquote><p>所以，只要确保加密方式不会泄漏，就可以确保C部分是不会被人伪造的，通过这种方式确保了token的安全性。</p></blockquote><blockquote><p>至于加密方式，一般来说会有2种方式，分别是：对称加密、非对称加密。一般而言，对称加密相对比较简单，但是其密钥泄露的风险比较高，而非对称加密，分为公钥和私钥，一般只要确保私钥不被泄漏就可以保证其安全性，所以非对称加密的泄漏风险要低一些。建议选择非对称加密进行计算C部分。</p></blockquote><h2 id="_7、图片是如何存储的" tabindex="-1">7、图片是如何存储的 <a class="header-anchor" href="#_7、图片是如何存储的" aria-label="Permalink to &quot;7、图片是如何存储的&quot;">​</a></h2><blockquote><p>对于图片的存储一般会有三种方式，分别是：本地磁盘存储、分布式文件系统、第三方云存储服务。在探花交友项目中，我们选择使用的是阿里云的OSS存储，它的使用基本流程如下：</p></blockquote><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904534.png" alt="image-20211101113833525"></p><h2 id="_8、登录功能的流程是什么样的" tabindex="-1">8、登录功能的流程是什么样的 <a class="header-anchor" href="#_8、登录功能的流程是什么样的" aria-label="Permalink to &quot;8、登录功能的流程是什么样的&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904499.png" alt="image-20211021141222134" style="zoom:80%;"><h2 id="_9、项目中的异常是如何处理的" tabindex="-1">9、项目中的异常是如何处理的？ <a class="header-anchor" href="#_9、项目中的异常是如何处理的" aria-label="Permalink to &quot;9、项目中的异常是如何处理的？&quot;">​</a></h2><blockquote><p>在项目中的异常，我们采用了统一异常处理的方式，具体采用的是SpringMVC提供了一套解决全局异常的处理方案，它可以在代码无侵入的前提下完成异常处理。</p></blockquote><p>其原理如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904212.png" alt="image-20211101123840242" style="zoom:80%;"><p>核心代码实现如下：</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;">/**</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> * 自定义统一异常处理</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> *  1、通过注解，声明异常处理类</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> *  2、编写方法，在方法内部处理异常，构造响应数据</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> *  3、方法上编写注解，指定此方法可以处理的异常类型</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> */</span></span>
<span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">ControllerAdvice</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">class</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">ExceptionAdvice</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"></span>
<span class="line"><span style="color:#89DDFF;">    </span><span style="color:#676E95;font-style:italic;">//处理业务异常</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">ExceptionHandler</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">BusinessException</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">class</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">ResponseEntity</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">handlerException</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">BusinessException</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">be</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">        be</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">printStackTrace</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#C792EA;">ErrorResult</span><span style="color:#A6ACCD;"> errorResult </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> be</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">getErrorResult</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;font-style:italic;">return</span><span style="color:#A6ACCD;"> ResponseEntity</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">status</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">HttpStatus</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">INTERNAL_SERVER_ERROR</span><span style="color:#89DDFF;">).</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">errorResult</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#89DDFF;">    </span><span style="color:#676E95;font-style:italic;">//处理不可预知的异常</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">ExceptionHandler</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">Exception</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">class</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">ResponseEntity</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">handlerException1</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">Exception</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">be</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">        be</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">printStackTrace</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;font-style:italic;">return</span><span style="color:#A6ACCD;"> ResponseEntity</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">status</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">HttpStatus</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">INTERNAL_SERVER_ERROR</span><span style="color:#89DDFF;">).</span><span style="color:#82AAFF;">body</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">ErrorResult</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">error</span><span style="color:#89DDFF;">());</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><h2 id="_10、聊聊今日佳人功能是怎么实现的" tabindex="-1">10、聊聊今日佳人功能是怎么实现的? <a class="header-anchor" href="#_10、聊聊今日佳人功能是怎么实现的" aria-label="Permalink to &quot;10、聊聊今日佳人功能是怎么实现的?&quot;">​</a></h2><blockquote><p>今日佳人，会推荐缘分值最大的用户，进行展现出来。缘分值的计算是由用户的行为进行打分，如：点击、点赞、评论、学历、婚姻状态等信息组合而成的。业务流程是这样的：</p></blockquote><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904271.png" alt="1564105451383"></p><p>推荐系统将推荐数据写入到MongoDB中，我们之间从结果中直接查询即可，表recommend_user结构如下：</p><div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;userId&quot;</span><span style="color:#FFCB6B;">:1001,</span><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">#推荐的用户id</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;toUserId&quot;</span><span style="color:#FFCB6B;">:1002,</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">#用户id</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;score&quot;</span><span style="color:#FFCB6B;">:90,</span><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">#推荐得分</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#FFCB6B;">&quot;date&quot;</span><span style="color:#82AAFF;">:</span><span style="color:#FFCB6B;">&quot;2019/1/1&quot;</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">#日期</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><p>核心代码如下：</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">DubboService</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">class</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">RecommendUserApiImpl</span><span style="color:#A6ACCD;">  </span><span style="color:#C792EA;">implements</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">RecommendUserApi</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Autowired</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">private</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">MongoTemplate</span><span style="color:#A6ACCD;"> mongoTemplate</span><span style="color:#89DDFF;">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#89DDFF;">    </span><span style="color:#676E95;font-style:italic;">//查询今日佳人</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">RecommendUser</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">queryWithMaxScore</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">Long</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">toUserId</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"></span>
<span class="line"><span style="color:#89DDFF;">        </span><span style="color:#676E95;font-style:italic;">// 根据toUserId查询，根据评分score排序，获取第一条</span></span>
<span class="line"><span style="color:#89DDFF;">        </span><span style="color:#676E95;font-style:italic;">// 构建Criteria</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#C792EA;">Criteria</span><span style="color:#A6ACCD;"> criteria </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> Criteria</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">where</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">toUserId</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">).</span><span style="color:#82AAFF;">is</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">toUserId</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">        </span><span style="color:#676E95;font-style:italic;">// 构建Query对象</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#C792EA;">Query</span><span style="color:#A6ACCD;"> query </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> Query</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">query</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">criteria</span><span style="color:#89DDFF;">).</span><span style="color:#82AAFF;">with</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">Sort</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">by</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">Sort</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">Order</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">desc</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">score</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">)))</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">limit</span><span style="color:#89DDFF;">(</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#89DDFF;">        </span><span style="color:#676E95;font-style:italic;">// 调用mongoTemplate查询</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;font-style:italic;">return</span><span style="color:#A6ACCD;"> mongoTemplate</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">findOne</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">query</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;">RecommendUser</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">class</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><h2 id="_11、好友推荐是怎么实现的" tabindex="-1">11、好友推荐是怎么实现的？ <a class="header-anchor" href="#_11、好友推荐是怎么实现的" aria-label="Permalink to &quot;11、好友推荐是怎么实现的？&quot;">​</a></h2><blockquote><p>推荐服务在技术层面来说是通过Spark + Spark MLlib实现的，通过读取到的用户数据，按照一定的规则进行计算用户之间的相似度（得分），比如：性别不同+10分，位置在同一个城市+10等，按照这样的规则就能得出2人之间的得分，再通过ALS算法进行计算并且得到推荐的用户数据，将结果数据写入到MongoDB中。</p></blockquote><blockquote><p>并且推荐计算设置了计算周期，我们设置的是每20分钟计算一次，即可得到新的推荐数据。在业务层面来说，在展现推荐用户时，只需要查询MongoDB即可，比如：在APP首页展现的今日佳人、推荐用户列表等功能。</p></blockquote><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904379.png" alt="1567064038029"></p><h2 id="_12、点赞功能如何实现的" tabindex="-1">12、点赞功能如何实现的 <a class="header-anchor" href="#_12、点赞功能如何实现的" aria-label="Permalink to &quot;12、点赞功能如何实现的&quot;">​</a></h2><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904528.png" alt="image-20211106113815545"></p><blockquote><p>点赞功能的实现思路参考上图，用户在对圈子中的动态内容点赞时，首先需要判断一下是否已经点赞过了，如果没有就继续执行，将点赞的数据存储到MongoDB中，为了高效的查询到点赞数，将点赞数存储到Redis中，在存储时使用的是Hash结构进行存储。</p></blockquote><h2 id="_13、和环信是怎么对接的" tabindex="-1">13、和环信是怎么对接的？ <a class="header-anchor" href="#_13、和环信是怎么对接的" aria-label="Permalink to &quot;13、和环信是怎么对接的？&quot;">​</a></h2><p>和环信平台的对接主要是在两个方面：</p><ul><li>前端对接 <ul><li>前端使用环信平台提供的SDK进行与环信进行通信</li><li>前提是需要通过账户的用户名与密码进行登录</li><li>用户名和密码是有后台系统提供</li><li>进行即时通讯时不再经过后台服务，直接与环信进行通信</li></ul></li><li>后端对接 <ul><li>后端的对接主要是在用户体系对接上，系统在进行用户注册时，同时在环信平台注册账户</li><li>为前端提供接口，返回该账户的用户名密码即可完成环信的对接</li></ul></li></ul><p>整体流程如下：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904650.png" alt="image-20201228165200223"></p><h2 id="_14、小视频功能是怎么做的" tabindex="-1">14、小视频功能是怎么做的？ <a class="header-anchor" href="#_14、小视频功能是怎么做的" aria-label="Permalink to &quot;14、小视频功能是怎么做的？&quot;">​</a></h2><blockquote><p>小视频功能类似于抖音、快手小视频的应用，用户可以上传小视频进行分享，也可以浏览查看别人分享的视频，并且可以对视频评论和点赞操作。</p></blockquote><blockquote><p>对于存储而言，小视频的存储量以及容量都是非常巨大的，所以我们选择自己搭建分布式存储系统 FastDFS进行存储。对于推荐算法，我们将采用多种权重的计算方式进行计算，对于加载速度，除了提升服务器带宽外可以通过CDN的方式进行加速。</p></blockquote><blockquote><p>发布视频的流程是：客户通过点击发布视频，会向后台传递3个数据，一个是视频封面图片，一个是视频，一个是文字。我们在后台会把视频封面图片保存到阿里的OSS图片存储服务器上会给我们返回一个图片的存储链接，把视频上传到本地部署的FastDFS上边会给我们返回一个视频的存储链接，之后我们这边构造一个Video对象，把需要的参数(文字，图片URL，视频URL，用户ID)通过调用VideoAPI进行保存到MongoDB中，之后构造返回值给用户进行显示发布成功。</p></blockquote><blockquote><p>接下来用户会跳转到小视频列表页面。分页查询视频列表是根据后台推荐系统进行智能推荐的，这个根据用户浏览视频的时候点赞，喜欢，评论的情况进行分数积累，把对应的分数值存储到推荐表中，当用户下拉刷新的时候，会从MongoDB中查询出推荐的视频。</p></blockquote><p>发布小视频的流程如下：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904808.png" alt="image-20211022180132797"></p><h2 id="_15、测灵魂功能是怎么做的" tabindex="-1">15、测灵魂功能是怎么做的？ <a class="header-anchor" href="#_15、测灵魂功能是怎么做的" aria-label="Permalink to &quot;15、测灵魂功能是怎么做的？&quot;">​</a></h2><blockquote><p>灵魂测试是通过用户答题的方式来进行分类，寻找同一类型或者内心深处的朋友。我们这块主要采用的技术有：MongoDB +Sprak+Mllib 当用户点击灵魂测试，我们会去后台加载用户的灵魂信息。</p></blockquote><p>如果是新用户我们会停留在初级灵魂题，后边的中级灵魂，高级灵魂则需解锁上一级才能进行答题。</p><blockquote><p>如果是老用户我们会加载用户之前测试灵魂的结果进行展示。如果之前他测评通过的是高级灵魂，那么就可以查看初级，中级，高级灵魂的测评。每一级的测评灵魂题都会有10道题，测评结束之后会根据用户的回答生成一个测试报告，通过点击我们可以查看属于自己的唯一一份灵魂报告。</p></blockquote><blockquote><p>生成的报告主要根据用户的属性外向，判断，抽象，理性组成。我们可以把自己的报告进行分享或者选择重做。当进行报告查看时候我们还可以查看系统给我推荐的测试结果相同的好友。通过点击好友头像，我们可以通过回答陌生人问题来进行确认好友，如果对方回复并通过就可以进行正常的交友啦。</p></blockquote><h2 id="_16、桃花传音功能是怎么做的" tabindex="-1">16、桃花传音功能是怎么做的？ <a class="header-anchor" href="#_16、桃花传音功能是怎么做的" aria-label="Permalink to &quot;16、桃花传音功能是怎么做的？&quot;">​</a></h2><blockquote><p>语音匹配类似漂流瓶类似，可以发送匿名语音，可以收听匿名语音。收听完匿名语音可以选择喜欢或不喜欢。如果双方互相喜欢那么可以配对成功互相关注，一个人每天只能接收8次，自己接收过语音，其他人不能再使用。</p></blockquote><blockquote><p>如果双方都点击喜欢，就可以添加为好友。这块我们采用的是MongoDB做数据存储，使用Dubbo做分布式服务的调用，使用FastDFS存储语音。</p></blockquote><h2 id="_17、有实现内容审核机制吗" tabindex="-1">17、有实现内容审核机制吗 <a class="header-anchor" href="#_17、有实现内容审核机制吗" aria-label="Permalink to &quot;17、有实现内容审核机制吗&quot;">​</a></h2><p>有的。在用户发布动态时就会进入内容审核环节，主要分为自动审核与手动审核两个流程。其流程如下：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904946.png" alt="image-20211106172956144"></p><p>自动审核使用的是阿里云的内容审核服务，如果自动审核不能确定结果时就需要进入人工审核流程，最终来确定内容是否为合法内容。</p><h2 id="_18、附近的人功能是怎么实现的" tabindex="-1">18、附近的人功能是怎么实现的？ <a class="header-anchor" href="#_18、附近的人功能是怎么实现的" aria-label="Permalink to &quot;18、附近的人功能是怎么实现的？&quot;">​</a></h2><blockquote><p>附近的人是根据当前用户的位置，查询附近范围内的用户，用户的位置通过APP获取位置数据上报给服务端的，上报频率是当变化大于500米时或每隔5分钟，在底层的存储是，将用户位置数据存储到MongoDB中，其中经纬度数据使用的类型是2dsphere索引类型。</p></blockquote><blockquote><p>在查询附近的人时，使用Spring Data MongoDB中的NearQuery进行查询，通过中心点+距离实现范围搜索，其查询结果会按照距离的由近到远排序。</p></blockquote><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904048.png" alt="1571966080530"></p><h2 id="_19、项目中有使用网关吗-网关有什么用" tabindex="-1">19、项目中有使用网关吗？网关有什么用 <a class="header-anchor" href="#_19、项目中有使用网关吗-网关有什么用" aria-label="Permalink to &quot;19、项目中有使用网关吗？网关有什么用&quot;">​</a></h2><p>在探花交友项目中有使用网关，是通过SpringCloud Gateway实现的，我们使用网关的目的主要有2个：</p><blockquote><ul><li>入口统一，无论是后台系统还是前端服务系统，都是统一的通过网关进入</li><li>统一鉴权，在网关中对用户的请求做统一的鉴权操作，这样可以确保进入服务的请求都是合法有效的请求</li></ul></blockquote><p>使用网关之后的架构如下：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904202.png" alt="image-20211107111959722"></p><p>统一鉴权流程：</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303130904314.png" alt="image-20211022153730945"></p></div></div></main><footer class="VPDocFooter" data-v-6b87e69f data-v-37656e44><!--[--><!--]--><!----><nav class="prev-next" data-v-37656e44><div class="pager" data-v-37656e44><a class="pager-link prev" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-37656e44><span class="desc" data-v-37656e44>Previous page</span><span class="title" data-v-37656e44>基础篇</span></a></div><div class="pager" data-v-37656e44><a class="pager-link next" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E8%8B%8D%E7%A9%B9%E5%A4%96%E5%8D%96/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-37656e44><span class="desc" data-v-37656e44>Next page</span><span class="title" data-v-37656e44>进阶篇</span></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"2、数据库_mysql_mysql面试_基础.md\":\"40da680a\",\"1、学前端_5、小程序_小程序项目.md\":\"60a1629b\",\"1、学前端_4、node_知识篇.md\":\"a7fb500e\",\"1、学前端_2、js_ts_es6 进阶.md\":\"6d07ba10\",\"1、学前端_3、vue_vue3_vue3进阶.md\":\"7ac622b4\",\"5、运维_jenkins.md\":\"929081f8\",\"1、学前端_2、js_ts_typescript.md\":\"875a4aa4\",\"2、数据库_mysql_mysql核心_设计.md\":\"7faf46d1\",\"2、数据库_mysql_mysql核心_基础.md\":\"d8e97f3e\",\"1、学前端_1、html_css_html基础.md\":\"7584d076\",\"1、学前端_5、专题篇_问题篇.md\":\"e893aaa2\",\"2、数据库_mysql_mysql面试_进阶.md\":\"f934806d\",\"3、springboot_运维_原理.md\":\"f4a39db6\",\"2、数据库_influxdb.md\":\"6e1711e1\",\"3、springboot_新特性.md\":\"cdf3e307\",\"mybatis_mybatisplus_jpa.md\":\"8e41681b\",\"1、学前端_5、小程序_小程序优化.md\":\"a2185198\",\"2、数据库_redis_redis基础.md\":\"856df0e0\",\"linux_实用脚本.md\":\"f2299dd5\",\"4、微服务_必备_分布式基础.md\":\"d49863d5\",\"2、数据库_redis_redis优化.md\":\"e66ae32f\",\"4、微服务_springsecurity_进阶篇.md\":\"235a8e9e\",\"5、运维_chatgpt.md\":\"10db3823\",\"2、数据库_mysql_分库分表.md\":\"e1c8a095\",\"start.md\":\"9bc1ff8d\",\"5、运维_github.md\":\"2ec6c735\",\"java学前端_css.md\":\"f11b47f0\",\"1、学前端_5、专题篇_知识篇.md\":\"a463ed8d\",\"linux_软件部署.md\":\"d6722925\",\"2、数据库_neo4j.md\":\"97ad22ac\",\"team.md\":\"ce467a6a\",\"nginx_实战篇.md\":\"7785486e\",\"index.md\":\"8c3ec167\",\"计算机基础_计算机网络_网络基础.md\":\"7a54a85d\",\"1、学前端_4、node_进阶篇.md\":\"60f6db69\",\"java_java集合.md\":\"a049b313\",\"1、学前端_3、vue_vue3_vue3高级.md\":\"614d1516\",\"1、学前端_5、小程序_微信小程序.md\":\"9a4be771\",\"5、运维_netty.md\":\"12ca0278\",\"2、数据库_mysql_mysql核心_运维.md\":\"83f97c16\",\"idea_vs code.md\":\"afdcb593\",\"java学前端_vue3_组件.md\":\"1086884e\",\"idea_chrome.md\":\"4a32afbc\",\"云原生_k8s.md\":\"db58e65a\",\"2、数据库_mysql_mysql核心_进阶.md\":\"61d16dff\",\"ssm_springbatch.md\":\"f799ab4a\",\"三高_分布式.md\":\"db1b8a1b\",\"2、数据库_elasticsearch_1、es基础.md\":\"04d17448\",\"linux_linux基础.md\":\"4b0bf394\",\"idea_idea插件.md\":\"fa86e45a\",\"可视化 _ 监控_可视化大屏.md\":\"004553bd\",\"2、数据库_mongodb_整合.md\":\"3c47d7f4\",\"4、微服务_springsecurity_基础篇.md\":\"534a3401\",\"4、微服务_进阶.md\":\"69095c58\",\"计算机基础_计算机基础_操作系统.md\":\"0f75d113\",\"可视化 _ 监控_zabbix.md\":\"71f2270e\",\"nginx_基础篇.md\":\"c7d8bb50\",\"1、学前端_4、node_项目实战.md\":\"bc5065b8\",\"2、数据库_redis_redis原理.md\":\"5cedf685\",\"可视化 _ 监控_监控基础.md\":\"ac56ce4d\",\"三高_高并发.md\":\"ea9ffc99\",\"2、数据库_redis_redis高级.md\":\"1d5872f6\",\"1、学前端_4、node_基础篇.md\":\"581cc13a\",\"2、数据库_mongodb_基础.md\":\"fb7a0a29\",\"idea_idea基础.md\":\"6f2f9638\",\"4、微服务_必备_sentinel.md\":\"2edfbf6c\",\"2、数据库_elasticsearch_3、es高级.md\":\"ef146606\",\"1、学前端_3、vue_vue3_vue3新语法.md\":\"8afd5409\",\"消息中间件_canal.md\":\"3949163c\",\"ssm_maven.md\":\"2c5e12ed\",\"4、微服务_springsecurity_高级篇.md\":\"882d3ff3\",\"linux_linux进阶.md\":\"188ef7b4\",\"计算机基础_设计模式_uml.md\":\"634ba256\",\"计算机基础_算法_leetcode.md\":\"77162fb9\",\"项目实战_小兔鲜_进阶篇1.md\":\"17c52c81\",\"1、学前端_2、js_ts_es6 基础.md\":\"fda3f18b\",\"项目实战_小兔鲜_进阶篇2.md\":\"a0f23006\",\"软件测试_测试基础.md\":\"8c1060cd\",\"2、数据库_redis_本地缓存.md\":\"00617fe6\",\"nginx_面试篇.md\":\"e3fb373a\",\"mybatis_mybatisplus_mybatis.md\":\"9239e0ad\",\"linux_shell.md\":\"ae53d83b\",\"2、数据库_mysql_mysql核心_优化.md\":\"36230425\",\"项目实战_项目推荐.md\":\"f9d97630\",\"mybatis_mybatisplus_mybatisplus.md\":\"0030fd35\",\"项目实战_百度地图_进阶篇.md\":\"c8b93267\",\"三高_高可用.md\":\"323840c5\",\"java_java新特性.md\":\"22abf56d\",\"软件测试_压力测试.md\":\"9ab44440\",\"java学前端_html_js.md\":\"e0fcd240\",\"2、数据库_redis_redis实战.md\":\"d6daeeab\",\"nginx_进阶篇.md\":\"e6b63195\",\"三高_秒杀.md\":\"3878bb64\",\"5、运维_git.md\":\"0264925c\",\"java_java进阶.md\":\"e79cb5b4\",\"并发 _ 多线程_基础篇.md\":\"7adbfac5\",\"项目实战_百度地图_基础篇.md\":\"8afa5954\",\"java学前端_react.md\":\"3ec827dd\",\"1、学前端_1、html_css_css基础.md\":\"01b56712\",\"项目实战_小兔鲜_基础篇.md\":\"646f5df5\",\"1、学前端_2、js_ts_js 基础.md\":\"cb13e36f\",\"可视化 _ 监控_监控进阶.md\":\"0cdbc292\",\"计算机基础_设计模式_基础篇.md\":\"51617287\",\"计算机基础_数据结构_基础篇.md\":\"b2bfd8d4\",\"项目实战_苍穹外卖_进阶篇.md\":\"48415e41\",\"ssm_spring.md\":\"ab514659\",\"消息中间件_rabbitmq.md\":\"45b1eb28\",\"1、学前端_1、html_css_网页进阶.md\":\"db998248\",\"消息中间件_kafka.md\":\"b747dabf\",\"云原生_docker.md\":\"983c7ba7\",\"4、微服务_必备_分布式锁.md\":\"5af1cf8d\",\"消息中间件_rocketmq.md\":\"d441da85\",\"项目实战_黑马头条_基础篇.md\":\"b05af3a6\",\"ssm_springmvc.md\":\"81b9714f\",\"项目实战_支付.md\":\"1d7407dd\",\"项目实战_黑马头条_进阶篇2.md\":\"bff0015b\",\"项目实战_黑马头条_进阶篇.md\":\"19f18388\",\"java学前端_vue2_组件.md\":\"58c6b1df\",\"3、springboot_基础篇.md\":\"529c66f4\",\"3、springboot_应用篇.md\":\"8b92aa61\",\"项目实战_黑马头条_高级篇.md\":\"227c08c1\",\"1、学前端_5、小程序_uniapp.md\":\"71a282b4\",\"项目实战_云尚办公_基础篇.md\":\"1fe188ba\",\"并发 _ 多线程_并发完善.md\":\"26619c46\",\"1、学前端_2、js_ts_js 进阶.md\":\"657dfb8f\",\"java_java高级.md\":\"23782d1a\",\"java_java基础.md\":\"86d67c77\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"VitePress\",\"description\":\"A VitePress site\",\"base\":\"/notebook/\",\"head\":[],\"appearance\":true,\"themeConfig\":{\"algolia\":{\"appId\":\"DW7O63I9IR\",\"apiKey\":\"f8ed758cdb288a8b06542bc35923c1a1\",\"indexName\":\"notebook\"},\"sidebar\":[{\"text\":\"Java\",\"collapsed\":true,\"items\":[{\"text\":\"Java基础\",\"link\":\"/Java/Java基础\"},{\"text\":\"Java新特性\",\"link\":\"/Java/Java新特性\"},{\"text\":\"Java进阶\",\"link\":\"/Java/Java进阶\"},{\"text\":\"Java集合\",\"link\":\"/Java/Java集合\"},{\"text\":\"Java高级\",\"link\":\"/Java/Java高级\"}]},{\"text\":\"Linux\",\"collapsed\":true,\"items\":[{\"text\":\"Linux基础\",\"link\":\"/Linux/Linux基础\"},{\"text\":\"Linux新特性\",\"link\":\"/Linux/Linux进阶\"},{\"text\":\"Shell脚本\",\"link\":\"/Linux/Shell\"},{\"text\":\"实用脚本\",\"link\":\"/Linux/实用脚本\"},{\"text\":\"软件部署\",\"link\":\"/Linux/软件部署\"}]},{\"text\":\"Nginx\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/Nginx/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/Nginx/进阶篇\"},{\"text\":\"实战篇\",\"link\":\"/Nginx/实战篇\"},{\"text\":\"面试篇\",\"link\":\"/Nginx/面试篇\"}]},{\"text\":\"SSM\",\"collapsed\":true,\"items\":[{\"text\":\"Maven\",\"link\":\"/SSM/Maven\"},{\"text\":\"Spring\",\"link\":\"/SSM/Spring\"},{\"text\":\"SpringMVC\",\"link\":\"/SSM/SpringMVC\"},{\"text\":\"SpringBatch\",\"link\":\"/SSM/SpringBatch\"}]},{\"text\":\"SpringBoot\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/3、SpringBoot/基础篇\"},{\"text\":\"应用篇\",\"link\":\"/3、SpringBoot/应用篇\"},{\"text\":\"新特性\",\"link\":\"/3、SpringBoot/新特性\"},{\"text\":\"运维&原理\",\"link\":\"/3、SpringBoot/运维&原理\"}]},{\"text\":\"SpringCloud\",\"collapsed\":true,\"items\":[{\"text\":\"SpringCloud\",\"link\":\"/4、微服务/进阶\"},{\"text\":\"Sentinel\",\"link\":\"/4、微服务/必备/Sentinel\"}]},{\"text\":\"SpringSecurity\",\"collapsed\":true,\"items\":[{\"text\":\"SpringSecurity基础篇\",\"link\":\"/4、微服务/SpringSecurity/基础篇\"},{\"text\":\"SpringSecurity进阶篇\",\"link\":\"/4、微服务/SpringSecurity/进阶篇\"},{\"text\":\"SpringSecurity高级篇\",\"link\":\"/4、微服务/SpringSecurity/高级篇\"}]},{\"text\":\"Mybatis & MybatisPlus\",\"collapsed\":true,\"items\":[{\"text\":\"Mybatis\",\"link\":\"/Mybatis&MybatisPlus/Mybatis\"},{\"text\":\"MybatisPlus\",\"link\":\"/Mybatis&MybatisPlus/MybatisPlus\"},{\"text\":\"JPA\",\"link\":\"/Mybatis&MybatisPlus/JPA\"}]},{\"text\":\"Git & ChatGPT\",\"collapsed\":true,\"items\":[{\"text\":\"Git\",\"link\":\"/5、运维/Git\"},{\"text\":\"Github\",\"link\":\"/5、运维/Github\"},{\"text\":\"ChatGPT\",\"link\":\"/5、运维/ChatGPT\"},{\"text\":\"Jenkins\",\"link\":\"/5、运维/Jenkins\"},{\"text\":\"Netty\",\"link\":\"/5、运维/Netty\"}]},{\"text\":\"数据库\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL基础\",\"link\":\"/2、数据库/MySQL/MySQL核心/基础\"},{\"text\":\"MySQL进阶\",\"link\":\"/2、数据库/MySQL/MySQL核心/进阶\"},{\"text\":\"MySQL优化\",\"link\":\"/2、数据库/MySQL/MySQL核心/优化\"},{\"text\":\"MySQL设计\",\"link\":\"/2、数据库/MySQL/MySQL核心/设计\"},{\"text\":\"MySQL运维\",\"link\":\"/2、数据库/MySQL/MySQL核心/运维\"},{\"text\":\"分库分表\",\"link\":\"/2、数据库/MySQL/分库分表\"}]},{\"text\":\"Redis\",\"collapsed\":true,\"items\":[{\"text\":\"Redis基础\",\"link\":\"/2、数据库/Redis/Redis基础\"},{\"text\":\"Redis优化\",\"link\":\"/2、数据库/Redis/Redis优化\"},{\"text\":\"Redis原理\",\"link\":\"/2、数据库/Redis/Redis原理\"},{\"text\":\"Redis高级\",\"link\":\"/2、数据库/Redis/Redis高级\"},{\"text\":\"Redis实战\",\"link\":\"/2、数据库/Redis/Redis实战\"},{\"text\":\"本地缓存\",\"link\":\"/2、数据库/Redis/本地缓存\"}]},{\"text\":\"MongoDB\",\"collapsed\":true,\"items\":[{\"text\":\"MongoDB基础\",\"link\":\"/2、数据库/MongoDB/基础\"},{\"text\":\"MongoDB进阶\",\"link\":\"/2、数据库/MongoDB/整合\"}]},{\"text\":\"ElasticSearch\",\"collapsed\":true,\"items\":[{\"text\":\"ES基础\",\"link\":\"/2、数据库/ElasticSearch/1、ES基础\"},{\"text\":\"ES高级\",\"link\":\"/2、数据库/ElasticSearch/3、ES高级\"}]},{\"text\":\"InfluxDB\",\"link\":\"/2、数据库/influxdb\"},{\"text\":\"Neo4j\",\"link\":\"/2、数据库/Neo4j\"}]},{\"text\":\"高并发 & 秒杀 & 分布式\",\"collapsed\":true,\"items\":[{\"text\":\"分布式理论\",\"link\":\"/三高/分布式\"},{\"text\":\"分布式锁\",\"link\":\"/4、微服务/必备/分布式锁\"},{\"text\":\"秒杀\",\"link\":\"/三高/秒杀\"},{\"text\":\"高可用\",\"link\":\"/三高/高可用\"},{\"text\":\"高并发\",\"link\":\"/三高/高并发\"}]},{\"text\":\"云原生\",\"collapsed\":true,\"items\":[{\"text\":\"Docker\",\"link\":\"/云原生/Docker\"},{\"text\":\"K8S\",\"link\":\"/云原生/K8S\"}]},{\"text\":\"可视化 & 监控\",\"collapsed\":true,\"items\":[{\"text\":\"监控基础\",\"link\":\"/可视化 & 监控/监控基础\"},{\"text\":\"监控进阶\",\"link\":\"/可视化 & 监控/监控进阶\"},{\"text\":\"可视化大屏\",\"link\":\"/可视化 & 监控/可视化大屏\"},{\"text\":\"Zabbix\",\"link\":\"/可视化 & 监控/Zabbix\"}]},{\"text\":\"学前端\",\"collapsed\":true,\"items\":[{\"text\":\"HTML+CSS\",\"collapsed\":true,\"items\":[{\"text\":\"HTML基础\",\"link\":\"/1、学前端/1、HTML+CSS/HTML基础\"},{\"text\":\"CSS基础\",\"link\":\"/1、学前端/1、HTML+CSS/CSS基础\"},{\"text\":\"网页进阶\",\"link\":\"/1、学前端/1、HTML+CSS/网页进阶\"}]},{\"text\":\"JS+TS\",\"collapsed\":true,\"items\":[{\"text\":\"JS基础\",\"link\":\"/1、学前端/2、JS+TS/JS 基础\"},{\"text\":\"JS进阶\",\"link\":\"/1、学前端/2、JS+TS/JS 进阶\"},{\"text\":\"ES6基础\",\"link\":\"/1、学前端/2、JS+TS/ES6 基础\"},{\"text\":\"ES6进阶\",\"link\":\"/1、学前端/2、JS+TS/ES6 进阶\"},{\"text\":\"TS基础\",\"link\":\"/1、学前端/2、JS+TS/TypeScript\"}]},{\"text\":\"NodeJS\",\"collapsed\":true,\"items\":[{\"text\":\"Node基础\",\"link\":\"/1、学前端/4、Node/基础篇\"},{\"text\":\"Node进阶\",\"link\":\"/1、学前端/4、Node/进阶篇\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/4、Node/项目实战\"}]},{\"text\":\"Vue\",\"collapsed\":true,\"items\":[{\"text\":\"Vue3进阶\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3进阶\"},{\"text\":\"Vue3高级\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3高级\"},{\"text\":\"Vue3新语法\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3新语法\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/3、Vue/Vue2/Vue2项目\"}]},{\"text\":\"小程序\",\"collapsed\":true,\"items\":[{\"text\":\"小程序基础\",\"link\":\"/1、学前端/5、小程序/微信小程序\"},{\"text\":\"小程序优化\",\"link\":\"/1、学前端/5、小程序/小程序优化\"},{\"text\":\"uniapp\",\"link\":\"/1、学前端/5、小程序/uniapp\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/5、小程序/小程序项目\"}]}]},{\"text\":\"计算机基础\",\"collapsed\":true,\"items\":[{\"text\":\"数据结构\",\"link\":\"/计算机基础/数据结构/基础篇\"},{\"text\":\"操作系统\",\"link\":\"/计算机基础/计算机基础/操作系统\"},{\"text\":\"设计模式\",\"link\":\"/计算机基础/设计模式/基础篇\"},{\"text\":\"计算机网络\",\"link\":\"/计算机基础/计算机网络/网络基础\"},{\"text\":\"UML\",\"link\":\"/计算机基础/设计模式/UML\"},{\"text\":\"LeetCode\",\"link\":\"/计算机基础/算法/LeetCode\"}]},{\"text\":\"项目实战\",\"collapsed\":true,\"items\":[{\"text\":\"云尚办公\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/云尚办公/基础篇\"}]},{\"text\":\"小兔鲜\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/小兔鲜/基础篇\"},{\"text\":\"进阶篇1\",\"link\":\"/项目实战/小兔鲜/进阶篇1\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/小兔鲜/进阶篇2\"}]},{\"text\":\"地图\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/百度地图/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/百度地图/进阶篇\"}]},{\"text\":\"苍穹外卖\",\"collapsed\":true,\"items\":[{\"text\":\"进阶篇\",\"link\":\"/项目实战/苍穹外卖/进阶篇\"}]},{\"text\":\"黑马头条\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/黑马头条/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/黑马头条/进阶篇\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/黑马头条/进阶篇2\"},{\"text\":\"高级篇\",\"link\":\"/项目实战/黑马头条/高级篇\"}]},{\"text\":\"支付\",\"link\":\"/项目实战/支付\"},{\"text\":\"项目推荐\",\"link\":\"/项目实战/项目推荐\"}]},{\"text\":\"团队成员\",\"link\":\"/team\"}],\"siteTitle\":\"任硕的文档\",\"logo\":\"/Vue.png\",\"nav\":[{\"text\":\"Java学前端\",\"items\":[{\"items\":[{\"text\":\"HTML+JS\",\"link\":\"/Java学前端/HTML+JS\"},{\"text\":\"CSS\",\"link\":\"/Java学前端/CSS\"},{\"text\":\"Vue2+组件\",\"link\":\"/Java学前端/Vue2+组件\"},{\"text\":\"Vue3+组件\",\"link\":\"/Java学前端/Vue3+组件\"},{\"text\":\"React\",\"link\":\"/Java学前端/React\"}]}],\"activeMatch\":\"/Java/\"},{\"text\":\"软件测试\",\"items\":[{\"items\":[{\"text\":\"测试基础\",\"link\":\"/软件测试/测试基础\"},{\"text\":\"压力测试\",\"link\":\"/软件测试/压力测试\"}]}]},{\"text\":\"多线程\",\"items\":[{\"items\":[{\"text\":\"基础篇\",\"link\":\"/并发 & 多线程/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/并发 & 多线程/并发完善\"}]}]},{\"text\":\"开发工具\",\"items\":[{\"items\":[{\"text\":\"Chrome\",\"link\":\"/IDEA/Chrome\"},{\"text\":\"IDEA基础\",\"link\":\"/IDEA/IDEA基础\"},{\"text\":\"IDEA插件\",\"link\":\"/IDEA/IDEA插件\"},{\"text\":\"VS Code\",\"link\":\"/IDEA/VS Code\"}]}]},{\"text\":\"消息中间件\",\"items\":[{\"items\":[{\"text\":\"RabbitMQ\",\"link\":\"/消息中间件/RabbitMQ\"},{\"text\":\"RocketMQ\",\"link\":\"/消息中间件/RocketMQ\"},{\"text\":\"Kafka\",\"link\":\"/消息中间件/Kafka\"},{\"text\":\"Canal\",\"link\":\"/消息中间件/Canal\"}]}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/renshuo123/renshuo123.github.io\"},{\"icon\":\"twitter\",\"link\":\"#\"},{\"icon\":{\"svg\":\"<svg t=\\\"1676028692954\\\" class=\\\"icon\\\" ...</path></svg>\"},\"link\":\"https://github.com/\"}]},\"locales\":{},\"scrollOffset\":90,\"cleanUrls\":false}");</script>
    
  </body>
</html>